2009-06-10 9 views
2

私はMacとObjective-Cを初めて使っているので、間違ったツリーをここで吠えているかもしれません。NSStringをFSCreateDirectoryUnicodeで使用できるものに変換するにはどうすればよいですか?

私は以下のコードを試してみましたが、正しくはないようです。 FSCreateDirectoryUnicodeの呼び出しで正しい長さが得られないようです。これを達成する最も簡単な方法は何ですか?

NSString *theString = @"MyFolderName"; 
NSData *unicode = [theString dataUsingEncoding:NSUnicodeStringEncoding allowLossyConversion:NO]; 
FSCreateDirectoryUnicode(&aFolderFSRef, [theString length], [unicode bytes], kFSCatInfoNone, NULL, &newFolderFSRef, NULL, NULL); 

答えて

4

生の文字列データにはいくつかの問題があります。しかし、ココアでそれを行うための最も簡単な方法は次のとおりです。

NSString *theString = @"MyFolderName"; 

NSString* path = [NSHomeDirectory() stringByAppendingPathComponent:theString]; 
[[NSFileManager defaultManager] createDirectoryAtPath:path 
              attributes:nil]; 

あなたは、ディレクトリが作成された場所へのパスを指定するのFSRefを使用しました。私の例では代わりにホームディレクトリを使用しています。実際にFSRef内のディレクトリを使用する必要があり、そのパスがわからない場合は、FSCreateDirectoryUnicode関数を使用する方が簡単です。

編集:正しいコードを使用するようにコードを変更しました。

NSString *theString = @"MyFolderName"; 
const UniChar* name = (const UniChar*)[theString cStringUsingEncoding:NSUnicodeStringEncoding]; 
FSCreateDirectoryUnicode(&aFolderFSRef, [theString length], name, kFSCatInfoNone, NULL, &newFolderFSRef, NULL, NULL); 

元のコードに壊れていた唯一のものは、dataUsingEncodingが文字列の外部表現を返すことでした。つまり、FSCreateDirectoryUnicodeは欲しくない、最初にUnicodeバイトオーダーマークがデータに含まれていることを意味します。

+0

ありがとう:

また、あなたはあなたのFSRef、その後、ニコライのソリューションのためのパスを取得するためにネイサン日のNDAlias NSStringの+ NDCarbonUtilitiesカテゴリ

+ (NSString *)stringWithFSRef:(const FSRef *)aFSRef { NSString * thePath = nil; CFURLRef theURL = CFURLCreateFromFSRef(kCFAllocatorDefault, aFSRef); if (theURL) { thePath = [(NSURL *)theURL path]; CFRelease (theURL); } return thePath; } 

を使用することができます! (FSFileManagerがNSFileManagerであることを認識した後) – staffan

+1

FSCreateDirectoryUnicodeは、UTF8文字列ではなくUniChar 16ビット文字列を必要とするため、2番目の例は機能しません。 –

+0

私には恥ずかしいものがあります:一つの重大な間違いと一つの答えの誤字。 正解のための編集された答えは、混乱のために申し訳ありません。おかげでPeter。 –

0

コードはOKです。長さとして[unicode length]/2を使用しますが、すべての(または少なくともほとんどすべての)ケースで[theString length]と同じにする必要があります。 - 助け

NSString* aFolderPath = [NSString stringWithFSRef:aFolderFSRef]; 
NSString* path = [aFolderPath stringByAppendingPathComponent:theString]; 
[[FSFileManager defaultManager] createDirectoryAtPath:path attributes:nil]; 
関連する問題