2012-01-02 2 views
2

저는 objective-c에서 새롭습니다. NSString에 포함 된 파일 경로가 있으며 파일 크기를 가져오고 싶습니다. 이 코드는 example이고 attributesOfItemAtPath : 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]; 

그것은 당신이 사용하는 것과 매우 유사하지만, 당신의 실수가 : 당신이 error: 처리에 NULL 대신 nil을 넣어.

documentation에 설명 된대로 경로에 물결표 확장도 확인하십시오 : 당신이 nil을 사이의 차이에 대한 몇 가지 설명을 찾을 수 있습니다

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

Here : 그래서 당신의 NSString *path 이런 식으로 뭔가해야 stringByExpandingTildeInPath를 사용 및 NULL.

+0

NSString * path = @ "Whatever.txt"와 함께 문제가 물결 모양 (~)이 아니라고 생각합니다. 코드가 작동하지 않습니다. – Joannes

+0

오류 처리에서'NULL' 대신'nil'을 시도해 보셨습니까? 게시 한 코드는 일부 응용 프로그램에서 테스트되고 사용되므로 제대로 작동하는지 확신합니다. ** 전체 경로 **로 시도해보십시오. **/Users/USERNAME/Library/Safari/History.plist ** 그리고 자신의 인스턴스를 생성하는 대신'NSFileManager'의'defaultMangaer'를 사용하십시오. [Here (http://pastebin.com/XBBCvqGu)](http://pastebin.com/XBBCvqgu)) 나는 당신이 찾고있는 것을 수행하는 코드를 작성했다 : 그것은 테스트되었고 작동한다. – Sylter

+0

나는 아무 것도하지 않았지만 오류는 없지만 코드가 작동하지 않습니다. 콘솔에서 나는 당신의 코드를 시험해 보았지만 괜찮습니다. 그러나 사용자 이름을 입력 할 필요가 있습니다. 나는 그것을 어떻게 넣을 수없는가? only/도서관/사파리/역사 .plist? – Joannes

1

다음을 사용하여 경로를 확장해야 할 수 있습니다

- (NSString *)stringByExpandingTildeInPath 
+0

이 방법은 미달합니다. 그것을 좋아한다 :) stringWithFormat과 NSHomeDirectory()보다 훨씬 간단하고 읽기 쉽다. –

0

대신 자신의 인스턴스를 생성하는 NSFileManager를에 defaultManager 클래스 메소드를 사용합니다. 또한 파일 경로에 ~ (물결표) 기호를 포함하지 마십시오. 홈 디렉토리를 얻으려면 NSHomeDirectory() 함수를 사용하십시오. 다음은 그 예입니다.

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

파일의 크기를 반환해야합니다.

+0

NSDictionary없이 * fileAttributes 나머지 코드는 작동하지 않습니다. 좋아요 ~없이 NSString * 경로 = @ "Whatever.txt"; NSDictionary * fileAttributes = [파일 관리자 attributesOfItemAtPath : 경로 오류 : 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이 필요하지 될 수 있기를 바랍니다.

관련 문제