Skip navigation.
 
mlRe: Obtain directory size.
FROM : Steve Christensen
DATE : Sat May 21 01:27:40 2005

On May 20, 2005, at 10:57 AM, Daniel Jalkut wrote:

> On May 20, 2005, at 9:42 AM, Daniel Jalkut wrote:
>

>>
>>   const ItemCount kMaxEntriesPerFetch = 256;
>>   ItemCount actualFetched;
>>   FSRef fetchedRefs[kMaxEntriesPerFetch];
>>   FSCatalogInfo fetchedInfos[kMaxEntriesPerFetch];

>
> Looking more carefully at my own code, I would probably suggest
> changing this so that the allocations for the fetchedRefs and
> fetchedInfos are made outside of the recursion. 
>
> I'm now afraid that this could easily exhaust the stack if a folder is
> sufficiently deep.  FSRefs and FSCatalogInfos aren't small!
>
> Daniel



You actually do need storage for the FSRef and FSCatalogInfo at each
recursion level, otherwise you're stomping on the [shared] storage.
Probably better to malloc/free the storage in each call to
fastFolderSizeAtFSRef instead, something like this:

- (unsigned long long) fastFolderSizeAtFSRef:(FSRef*)theFileRef
{
    unsigned long long totalSize = 0;
    FSIterator    thisDirEnum;

    if (FSOpenIterator(theFileRef, kFSIterateFlat, &thisDirEnum) ==
noErr)
    {
        const ItemCount kMaxEntriesPerFetch = 256;

        struct SFetchedInfo
        {
            FSRef          fFSRefs[kMaxEntriesPerFetch];
            FSCatalogInfo  fInfos[kMaxEntriesPerFetch];
        };

        // might as well allocate all the storage with a single call...
        SFetchedInfo*    fetched = (SFetchedInfo*)
malloc(sizeof(SFetchedInfo));

        if (fetched != NULL)
        {
            ItemCount  actualFetched;
            OSErr      fsErr = FSGetCatalogInfoBulk(thisDirEnum,
kMaxEntriesPerFetch, &actualFetched,
                                    NULL, kFSCatInfoDataSizes |
kFSCatInfoNodeFlags, fetched->fInfos,
                                    fetched->fFSRefs, NULL, NULL);
            [...]

            free(fetched);
        }

        FSCloseIterator(thisDirEnum);
    }

    return totalSize;
}

Related mailsAuthorDate
mlObtain directory size. Julian May 20, 18:09
mlRe: Obtain directory size. Brian Bergstrand May 20, 18:42
mlRe: Obtain directory size. Daniel Jalkut May 20, 18:42
mlRe: Obtain directory size. Jim Correia May 20, 18:50
mlRe: Obtain directory size. Chris Parker May 20, 19:00
mlRe: Obtain directory size. Jim Correia May 20, 19:00
mlRe: Obtain directory size. James Bucanek May 20, 19:20
mlRe: Obtain directory size. Julian May 20, 19:22
mlRe: Obtain directory size. Daniel Jalkut May 20, 19:57
mlRe: Obtain directory size. J.M.Brough May 20, 20:06
mlRe: Obtain directory size. Rosyna May 21, 01:26
mlRe: Obtain directory size. Steve Christensen May 21, 01:27