私は非常にトリッキーな戦闘方法を使用しています:)のような文字列をFi?le*/ Name
ファイル名として安全に使用できるようにしますFile_Name
。それを変換するココアの方法があると確信しています。そして、質問するのに最適な場所はここだと確信しています:)
ありがとうございました!
これにより、Ismail の無効な文字セットに基づいて、ファイル名のすべての無効な文字が削除されます (彼の文字セットがどの程度完全かは確認していません)。
- (NSString *)_sanitizeFileNameString:(NSString *)fileName {
NSCharacterSet* illegalFileNameCharacters = [NSCharacterSet characterSetWithCharactersInString:@"/\\?%*|\"<>"];
return [[fileName componentsSeparatedByCharactersInSet:illegalFileNameCharacters] componentsJoinedByString:@""];
}
componentsSeparatedByCharactersInSet:
NSString - 純粋なアルファベットのみに変換 (つまり、アクセントと句読点を削除)
シェルを明示的に実行するか、popen
またはなどの関数を使用して暗黙的にシェルを実行する場合system
を除き、パス名区切り文字以外をエスケープする理由はありません。
また、ファイル名がピリオドで始まらないことを強制することもできます (これにより、Finder がファイルを非表示にする可能性があります)。また、ファイルが空ではなく、NAME_MAX
文字数* よりも短いことも強制する必要があります。
*syslimits.h
はバイトと書いてありますが、ファイル マネージャーで調べると文字です。どちらがココアに適しているかわかりません。
私はjohnboiles の答えを繰り返し、Swift に変換し、それを拡張機能として書きました:
extension String {
var stringForFilePath: String {
// characterSet contains all illegal characters on OS X and Windows
let characterSet = NSCharacterSet(charactersInString: "\"\\/?<>:*|")
// replace "-" with character of choice
return componentsSeparatedByCharactersInSet(characterSet).joinWithSeparator("-")
}
}
hereから参照されている文字セットが不正です。
そしてもちろん、恣意的な憎悪リスト(他の回答から盗まれた)を持つswift2の男がいるに違いありません。その男は私です:
func sanitizedString(string : String) -> String {
// put anything you dislike in that set ;-)
let invalidFsChars = NSCharacterSet(charactersInString: "/* <>?%|")
let components = string.componentsSeparatedByCharactersInSet(invalidFsChars)
return components.joinWithSeparator("")
}
ウィキペディアによると、ファイル名から除外する必要がある最も一般的な文字は次のとおりです。
/\?%*|"<>
http://en.wikipedia.org/wiki/ファイル名
それを考えると、代替ソリューションのinvertedSet操作は集中的になる可能性があるため、私にとっては以下がよりクリーンなアプローチです:
NSCharacterSet *invalidFsChars = [NSCharacterSet characterSetWithCharactersInString:@"/\\?%*|\"<>"];
NSString *scrubbed = [originalStr stringByTrimmingCharactersInSet:invalidFsChars];
このようにして、ダッシュなどを含むファイル名を引き続き許可できます。