2013-04-01 2 views
3

после поиска я не нашел мою проблему:Как я могу получить размер файла в Objective-C

NSString *path = @"~/Desktop/folder/"; 
pathg = [path stringByExpandTitlePath]; 
NSFileManager *fm = [NSFileManager defaultManager]; 
NSArray *array = [fm contentsOfDirectoryAtPath: path error: NULL]; 

for(int i = 0; i < array.count; ++i) 
{ 
    NSFileSize *num = [array[i] fileSize]; 
} 

ошибка: использование необъявленной идентификатора «Num»

+0

http://stackoverflow.com/questions/1694897/iphone-sdk-see-size-of-local-file-one-created-by-application – Ramz

ответ

3

Если вам нужно получить размер файла одного файла, вы можете сделать это, создав для него URL-адрес файла и напрямую запрашивая атрибуты URL.

NSString *filePath = [@"~/.bash_history" stringByExpandingTildeInPath]; 
NSURL *fileURL = [NSURL fileURLWithPath:filePath]; 
NSNumber *fileSizeValue = nil; 
NSError *fileSizeError = nil; 
[fileURL getResourceValue:&fileSizeValue 
        forKey:NSURLFileSizeKey 
        error:&fileSizeError]; 
if (fileSizeValue) { 
    NSLog(@"value for %@ is %@", fileURL, fileSizeValue); 
} 
else { 
    NSLog(@"error getting size for url %@ error was %@", fileURL, fileSizeError); 
} 

Если вам нужно перебирать содержимое каталога, как и в вашем вопросе, вы можете сделать URL на основе версии, а также путь в вашем вопросе. Использование contentsOfDirectoryAtPath:... возвращает массив имен файлов как NSString с, и вы должны восстановить полный путь и получить атрибуты в качестве дополнительного шага:

NSString *directoryPath = [@"~" stringByExpandingTildeInPath]; 
    NSFileManager *fm = [NSFileManager defaultManager]; 
    NSArray *array = [fm contentsOfDirectoryAtPath: directoryPath error:NULL]; 
    for (NSString *filename in array) { 
     NSError *attributesError = nil; 
     NSDictionary *attributes = [fm attributesOfItemAtPath:[directoryPath stringByAppendingPathComponent:filename] 
                 error:&attributesError]; 
     unsigned long long size = [attributes fileSize]; //Note this isn't a pointer 
     NSLog(@"%llu", size); 
    } 

Вы можете сделать аналогичное решение с помощью файла URL-:

NSString *directoryPath = [@"~" stringByExpandingTildeInPath]; 
    NSURL *directoryURL = [NSURL fileURLWithPath:directoryPath 
            isDirectory:YES]; 
    NSFileManager *fm = [NSFileManager defaultManager]; 
    NSError *contentsError = nil; 
    NSArray *contents = [fm contentsOfDirectoryAtURL:directoryURL 
          includingPropertiesForKeys:@[NSURLFileSizeKey, NSURLIsDirectoryKey] 
              options:0 
               error:&contentsError]; 
    if (contents) { 
     for (NSURL *contentURL in contents) { 
      NSError *isDirectoryError = nil; 
      NSNumber *isDirectoryNumber = nil; 
      [contentURL getResourceValue:&isDirectoryNumber 
            forKey:NSURLIsDirectoryKey 
            error:&isDirectoryError]; 
      if (isDirectoryNumber) { 
       if (![isDirectoryNumber boolValue]) { 
        NSNumber *fileSizeNumber = nil; 
        NSError *sizeError = nil; 
        [contentURL getResourceValue:&fileSizeNumber 
              forKey:NSURLFileSizeKey 
              error:&sizeError]; 
        if (fileSizeNumber) { 
         NSInteger size = [fileSizeNumber integerValue]; 
         NSLog(@"%li", (long)size); 
        } 
        else { 
         NSLog(@"error getting file size for file %@ error:%@",contentURL,sizeError); 
        } 
       } 
      } 
      else { 
       NSLog(@"error getting is url %@ was directory: %@", contentURL, isDirectoryError); 
      } 
     } 
    } 
    else { 
     NSLog(@"error getting contents for directory %@ error: %@", directoryURL, contentsError); 
    } 
+0

Вы можете объяснить мне, почему я должен получить атрибуты из этих путей? – user2214609

+0

Вы получаете массив имен файлов из метода 'contentOfDirectoryAtPath: error:'. Затем вы должны запрашивать файлы по имени для их размера, загружая атрибуты. –

+0

любая причина, почему все мои файлы показывают мне одинаковый размер? (у меня есть размер разных файлов) – user2214609

2

Попробуйте это:

NSString *yourPath=[@"~/Desktop/folder/abc.png" stringByExpandingTildeInPath]; 
NSFileManager *fileManager=[NSFileManager defaultManager]; 
NSDictionary *attributesDict=[fileManager attributesOfItemAtPath:yourPath error:NULL]; 
NSInteger fileSize=[attributesDict fileSize]; 

NSLog(@"%ld",fileSize); 
+0

Этот код должен вызывать 'stringByExpandingTildeInPath' на @" ~/Desktop/folder/", а также вызывать' integerValue' в результате '[attributesDict fileSize]'. –

+0

@CarlVeazey: Спасибо за указание на ошибку. Для второго это будет хорошо, поскольку fileSize вернет long long int и NSInteger будет работать на него, не так ли. –

+0

А, ладно, забыл об этом! –

Смежные вопросы