2012-01-02 29 views
2

私はobjective-cで新しいです。 NSStringに含まれるファイルへのパスがあり、ファイルサイズを取得します。私はこのexampleを見つけて、deprecatedコードを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で説明したように、あなたのパスにチルダを展開することも確認してください:stringByExpandingTildeInPathを使用し、あなたのNSString *pathはこのようなものでなければなりませんので:

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

Hereあなたはnilの違いについていくつか説明を見つけることができますおよび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

私はnilを試しましたが、エラーはありませんが、コードは機能しません。コンソールで私はあなたのコードを試してみましたが、大丈夫ですが、あなたのユーザ名を入力する必要がありますか?どのように私はそれを置くことができますか? /Library/Safari/History.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 * path = @ "Whatever.txt"などのように〜を使わないでOK。 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が必要とされないであろう期待しています。

関連する問題