Archive for the ‘NSFileManager’ Category

ファイルがエイリアスかどうかを判断する必要がある場合に、
NSFileManager経由で、attributesを取ったところで、
取得できない。
シンボリックリンクかどうかはattributeのNSFileTypeがNSFileTypeSymbolicLinkかどうかで
取得することができる。
#Finderで見ると、同じアイコンなので紛らわしい。。。

そこで、CoreServicesのCarbonCoreにあるAlias.hの
FSIsAliasFileを使って判別することにする。
NSFileManagerのカテゴリとして実装

  1.  
  2. -(BOOL)isAlias:(NSString*)path{
  3.         BOOL returnValue = NO; //返戻値
  4.         FSRef fsref;
  5.         Boolean isAlias, isFolder;
  6.        
  7.         if( [ self stringPathToFSRef:path fsRef:&fsRef ] &&
  8.                 noErr == FSIsAliasFile(&fsref, &isAlias, &isFoder ) ){
  9.                 returnValue = isAlias;
  10.         }
  11.        
  12.         return returnValue;
  13. }
  14.  
  15. -(BOOL)stringPathToFSRef:(NSString*)path fsRef:(FSRef*)outRef{
  16.         BOOL returnValue = NO;
  17.        
  18.         OSStatus err = FSPathMakeRef((const UInt8*)[ path fileSystemRepresentation ] , outRef, NULL );
  19.        
  20.         if( err == noErr ){
  21.                 returnValue = YES;
  22.         }
  23.        
  24.         return returnValue;
  25. }
  26.  

これで、パスのファイルがエイリアスかどうかわかった。

NSFileManagerのcreateDirectoryAtPathを使用して、
引数で渡されたパスのフォルダを作成するメソッドを作ってみた。

NSFileManagerのカテゴリで実装。

  1. -(BOOL)createDirectorysAtPath:(NSString *)path{
  2. //ファイルまでのパスが渡ってくる
  3. NSString * folderFilePath = path;
  4.  
  5. //パスの各要素を配列にする
  6. NSArray * array = [ NSArray arrayWithArray:[ folderFilePath pathComponents]];
  7.  
  8. //ルートへ
  9. [ self changeCurrentDirectoryPath:@"/"];
  10. NSEnumerator * enum1 = [ array objectEnumerator];
  11. id obj1;
  12. while( obj1 = [ enum1 nextObject]){
  13. //フォルダが存在しているかチェック
  14. if ( [ self fileExistsAtPath:obj1]){
  15. [ self changeCurrentDirectoryPath:obj1];
  16.  
  17. }else{
  18. //フォルダなかったらつくる
  19. NSDictionary*   theAttr  = [NSDictionary dictionaryWithObjectsAndKeys:
  20. [NSDate date],NSFileModificationDate,
  21. @"owner",@"NSFileOwnerAccountName",
  22. @"group",@"NSFileGroupOwnerAccountName",
  23. nil,@"NSFilePosixPermissions",
  24. [NSNumber numberWithBool:YES],@"NSFileExtensionHidden",
  25. nil];
  26. if ( [ self createDirectoryAtPath:obj1 attributes:theAttr]){
  27. [ self changeCurrentDirectoryPath:obj1];
  28. }else{
  29. return NO;
  30. }
  31. }
  32. }
  33. return YES;
  34. }

フォルダがすべて作成されると、YESを返す。
結構便利でいろんなところで使用中。

ボリュームの空き容量の取得方法。

NSFileManagerのfileSystemAttributesAtPath:を使用する

このメソッドは返り値がNSDictionaryなので、空き容量のキーから取得することができる。

使い方:

  1. NSDictionary * dict = [ [ NSFileManager defaultManager ] fileSystemAttributesAtPath:@"/" ];
  2. id obj = [ dict valueForKey:@"NSFileSystemFreeSize" ];

サンプルのobjのクラスはNSNumberになっている。

NSFileManagerのメソッド、「- (NSDictionary *)fileAttributesAtPath:(NSString *)path traverseLink:(BOOL)flagで取得できるDictionaryのキーについて。

仕様書を見てみると、以下のようなキーで取得できるようだ。

  • NSFileType; ファイルタイプ
  • NSFileSize; ファイルサイズ
  • NSFileModificationDate; 更新日時
  • NSFileReferenceCount; 
  • NSFileDeviceIdentifier;
  • NSFileOwnerAccountName;
  • NSFileGroupOwnerAccountName;
  • NSFilePosixPermissions;
  • NSFileSystemFileNumber;
  • NSFileExtensionHidden;
  • NSFileHFSCreatorCode;
  • NSFileHFSTypeCode;
  • NSFileImmutable; Finderのロック(変更するかしないか)
  • NSFileAppendOnly;
  • NSFileCreationDate;
  • NSFileOwnerAccountID;
  • NSFileGroupOwnerAccountID;

NSFileManagerを使用して、ファイルを作成する。

  1.  
  2. NSString * filePath = @"/Users/AAA/Desktop/createFile.txt"; //作成ファイルパス  
  3. NSData * data = [ NSData data ]; //保存データ    
  4. NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:
  5.                                                         [NSDate date],NSFileModificationDate,
  6.                                 @"owner",@"NSFileOwnerAccountName",
  7.                                 @"group",@"NSFileGroupOwnerAccountName",
  8.                                 nil,@"NSFilePosixPermissions",
  9.                                 [NSNumber numberWithBool:YES],@"NSFileExtensionHidden",nil];
  10. [ [ NSFileManager defaultManager] createFileAtPath:filePath
  11.                                                                 contents:data attributes:dic];
  12.  

NSFileManagerを使用して、ファイルをコピーする方法

  1.  
  2. //書類フォルダにあるtest.txtをデスクトップにコピーする
  3. NSString * sourcePath = @"/Users/AAA/Documents/test.txt";
  4. NSString * targetPath  = @"/Users/AAA/Desktop/test.txt";
  5.  
  6. NSFileManager * fManager = [NSFileManager defaultManager ];
  7. if( [ fManager copyPath:sourcePath toPath:targetPath handler:nil ] ){
  8.     NSLog(@"SUCCESS");
  9. }else{
  10.     NSLog(@"FAILD");
  11. }
  12.  

NSFileManagerを用いたファイルの移動方法

  1.  
  2. //書類フォルダにあるtest.txtをデスクトップに移動する
  3. NSString * sourcePath = @"/Users/AAA/Documents/test.txt";
  4. NSString * targetPath  = @"/Users/AAA/Desktop/test.txt";
  5.  
  6. NSFileManager * fManager = [NSFileManager defaultManager ];
  7.  
  8. if( [ fManager movePath:sourcePath toPath:targetPath handler:nil ] ){
  9.     NSLog(@"SUCCESS");
  10. }else{
  11.     NSLog(@"FAILD");
  12. }
  13.  
  14.