سؤال

الآن أنا أستخدم هذا الرمز للحصول على حجم المجلد:

NSArray *contents;
        NSEnumerator *enumerator;
        NSString *path;
        contents = [[NSFileManager defaultManager] subpathsAtPath:folderPath];
        enumerator = [contents objectEnumerator];
        while (path = [enumerator nextObject]) {
            NSDictionary *fattrib = [[NSFileManager defaultManager] fileAttributesAtPath:[folderPath stringByAppendingPathComponent:path] traverseLink:YES];
            fileSize +=[fattrib fileSize];
        }

        [contents release];
        [path release]; 

المشكلة هي أنها بليغ للغاية. إما يضيف عدد قليل من ميغابايت أو خصم عدد قليل من ميغابايت من الحجم الفعلي. على سبيل المثال، حصلت على حجم ملف حزمة .APP وبلغت هذه الطريقة 16.2 ميغابايت، في حين أن الشيء الفعلي هو 15.8.

ما هي أفضل طريقة للحصول على حجم مجلد؟

شكرًا

هل كانت مفيدة؟

المحلول

كنت بحاجة للقيام بذلك اليوم بنفسي، وقد وجدت أن الكود في هذا المنشور في قائمة الكاكاو فائقة سريعة ومطابقة ما يقوله البايت. (لا تنس أو في KFSCATInforsRCSizes العلم حتى تحصل على أحجام شوكة الموارد، أيضا!)

إذا كنت بحاجة إلى مزيد من التفسير حول كيفية استخدامه، فما عليك سوى ترك تعليق وسأقوم بتحرير هذا المنشور. =)

نصائح أخرى

الوثائق ل fileSize تنص على أنها لا تشمل حجم شوكة الموارد. قد تحتاج إلى استخدام مدير ملف الكربون API لحساب أحجام الدليل بشكل موثوق.

أردت فقط اقتراح ديف ديلونج حول المنشور على Cocoa-dev، ولكن أضف ملاحظة تحذيرية للتأكد من قراءة جميع المشاركات في مؤشر الترابط. هناك واحد من روزينا لا يستحق الأمر بشكل خاص. في حالتي، اتبعت هذه النصيحة (تغيير العناصر القصوى لكل جلب إلى 40) وشهدت قفزة سريعة بالإضافة إلى النهاية إلى علة تحطم سيئة.

آمل أن يساعد هذا

- (unsigned long long) fastFolderSizeAtFSRef:(NSString *)theFilePath
{
unsigned long long totalSize = 0;
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL  isdirectory;
NSError *error;

if ([fileManager fileExistsAtPath:theFilePath])
{


    NSMutableArray * directoryContents = [[fileManager contentsOfDirectoryAtPath:theFilePath error:&error] mutableCopy];


    for (NSString *fileName in directoryContents)
    {
        if (([fileName rangeOfString:@".DS_Store"].location != NSNotFound) )
            continue;



            NSString *path = [theFilePath stringByAppendingPathComponent:fileName];
            if([fileManager fileExistsAtPath:path isDirectory:&isdirectory] && isdirectory  )
            {

                    totalSize =  totalSize + [self fastFolderSizeAtFSRef:path];



            }
            else
            {
                unsigned long long fileSize = [[fileManager attributesOfItemAtPath:path error:&error] fileSize];
                totalSize = totalSize + fileSize;
            }
    }
}
return totalSize;
}

هذا هو عادة كيف يتم ذلك. 2 الاحتمالات:

  1. تحقق من إجراءات تحويل البايت -> Megabyte. أيضا، هل تريد ميغابايت أو المهيبات؟ (ربما يعتمد على ما تقارنه به.)

  2. حاول اجتياز لا traverseLink معامل. قد يكون هناك نوبة رائعة في الحزمة التي تشير إلى شيء آخر أن الروتين الذي تقارنه به لن يمرأ. ستحسب شيئا ما في الحزمة مرتين، أو ستشمل شيئا خارج الحزمة بالكامل (على الأرجح السابق).

أعلم أن هذا موضوع قديم. ولكن لأي شخص هناك تبحث عن إجابات حول كيفية القيام بذلك،

[[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir];
        if (isDir) {
            NSPipe *pipe = [NSPipe pipe];
            NSTask *t = [[[NSTask alloc] init] autorelease];
            [t setLaunchPath:@"/usr/bin/du"];
            [t setArguments:[NSArray arrayWithObjects:@"-k", @"-d", @"0", path, nil]];
            [t setStandardOutput:pipe];
            [t setStandardError:[NSPipe pipe]];

            [t launch];

            [t waitUntilExit];

            NSString *sizeString = [[[NSString alloc] initWithData:[[pipe fileHandleForReading] availableData] encoding:NSASCIIStringEncoding] autorelease];
            sizeString = [[sizeString componentsSeparatedByString:@" "] objectAtIndex:0];
            bytes = [sizeString longLongValue]*1024;
        }
        else {
            bytes = [[[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil] fileSize];
        }

سوف تستخدم محطة لتحديد حجم للمجلدات في بايت. وسوف تستخدم Cocoa المدمج في NSFILEMANAGER للحصول على حجم الملفات. انها سريعة جدا، والحصول على الحجم بالضبط تقارير مكتشف.

هذا الرمز هو امتداد (فئة) إلى فئة NSFILEMANAGER. أنه يلخص أحجام جميع محتويات المجلدات. لاحظ أن علاج الخطأ يمكن تعزيزه.

 @interface NSFileManager(Util)

        - (NSNumber *)sizeForFolderAtPath:(NSString *) source error:(NSError **)error;

    @end

    @implementation NSFileManager(Util)

        - (NSNumber *)sizeForFolderAtPath:(NSString *) source error:(NSError **)error
        {
            NSArray * contents;
            unsigned long long size = 0;
            NSEnumerator * enumerator;
            NSString * path;
            BOOL isDirectory;

            // Determine Paths to Add 
            if ([self fileExistsAtPath:source isDirectory:&isDirectory] && isDirectory) 
            { 
                contents = [self subpathsAtPath:source]; 
            } 
            else 
            { 
                contents = [NSArray array];
            }
            // Add Size Of All Paths 
            enumerator = [contents objectEnumerator]; 
            while (path = [enumerator nextObject]) 
            {
                NSDictionary * fattrs = [self attributesOfItemAtPath: [ source stringByAppendingPathComponent:path ] error:error];
                size += [[fattrs objectForKey:NSFileSize] unsignedLongLongValue]; 
            }
            // Return Total Size in Bytes 

            return [ NSNumber numberWithUnsignedLongLong:size];
        }

        @end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top