2012-01-02 3 views
2

Я новичок в объективе-c. У меня есть путь к файлу, содержащемуся в NSString, и я хочу получить размер файла. Я нашел это example и изменил устаревший код с атрибутамиOfItemAtPath: error: но путь всегда недействителен.Получить файл с заданным путем

NSFileManager *fileManager = [[NSFileManager alloc] init]; 
NSString *path = @"~/Library/Safari/History.plist"; 
NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath: path error: NULL]; 


if (fileAttributes != nil) { 
    NSNumber *fileSize; 

    if (fileSize == [fileAttributes objectForKey:NSFileSize]) { 
     NSLog(@"File size: %qi\n", [fileSize unsignedLongLongValue]); 
    } 

} 
else { 
    NSLog(@"Path (%@) is invalid.", pPath); 
} 
[NSFileManager release]; 

ответ

4

Это должно работать:

uint64_t fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:_filePath error:nil] fileSize]; 

Это очень похож на тот, используемый вами, но в вашей есть ошибка: вы кладете NULL вместо nil в error: обращении.

Убедитесь также расширить тильды на своем пути, как описано в documentation: использовать stringByExpandingTildeInPath, так что ваши NSString *path должно быть что-то вроде этого:

NSString *path = [[NSString stringWithString:@"~/Library/Safari/History.plist"] stringByExpandingTildeInPath]; 

Here вы можете найти некоторые объяснения по поводу разницы между nil и NULL.

+0

Я думаю, что проблема не в тильде (~), а в NSString * path = @ "Whatever.txt"; код не работает. – Joannes

+0

Вы пытались использовать 'nil' вместо' NULL' при обработке ошибок? Код, который я опубликовал, проверен и используется в некоторых моих приложениях, поэтому я уверен, что он работает. Попробуйте ** полный путь **, например. **/Пользователи/USERNAME/Library/Safari/History.plist ** и используйте 'defaultMangaer'' NSFileManager' вместо создания собственного экземпляра. [Здесь (http://pastebin.com/XBBCvqGu)](http://pastebin.com/XBBCvqGu) Я написал фрагмент кода, который делает то, что вы ищете: он протестирован и работает. – Sylter

+0

Я пробовал ноль, и нет ошибки, но код не работает. В консоли я попробовал ваш код, и все в порядке, но мне нужно ввести ваше имя пользователя. как я могу не сказать? только /Library/Safari/History.plist? – Joannes

1

Вы, возможно, потребуется расширить путь с помощью:

- (NSString *)stringByExpandingTildeInPath 
+0

Этот метод недооценен. Мне это нравится :) Гораздо проще и читабельнее, чем stringWithFormat и NSHomeDirectory(). –

0

Используйте метод defaultManager класса на NSFileManager вместо создания своего собственного экземпляра. Кроме того, не указывайте символ ~ (тильда) в вашем пути к файлу. Используйте функцию NSHomeDirectory(), чтобы вместо этого получить домашний каталог. Вот пример:

NSString *path = [NSString stringWithFormat:@"%@/Library/Safari/History.plist", NSHomeDirectory()]; 
[[[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil] fileSize]; 

Это должно вернуть размер вашего файла.

+0

без NSDictionary * fileAttributes остальная часть кода не работает. Ok без ~ использования, например, NSString * path = @ "Whatever.txt"; NSDictionary * fileAttributes = [атрибуты fileManagerOfItemAtPath: ошибка пути: NULL]; код не работает снова. – Joannes

1

вы можете получить размер по:

NSDictionary * properties = [[NSFileManager defaultManager] attributesOfItemAtPath:yourFilePath error:nil]; 
NSNumber * size = [properties objectForKey: NSFileSize]; 

размер является NSNumber, который содержит неподписанный долго долго.

1

Ваш путь всегда будет недействительным из-за супер-глупой ошибки в вашем коде.

Изменить

if (fileSize == [fileAttributes objectForKey:NSFileSize]) { 

в

if (fileSize = [fileAttributes objectForKey:NSFileSize]) { 

Я надеюсь, никаких дальнейших explanatiuon не потребуется.

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

  • Нет связанных вопросов^_^