私は非常にトリッキーな戦闘方法を使用しています:)Fi?le*/ Name
のような文字列をFile_Name
のようなファイル名として安全に使用できるようにします。私はそれを変換するカカオの方法があると確信しています。そして、私は尋ねるのに最適な場所はここにあると確信しています:)
ありがとうございました!
シェルを明示的に実行しているか、popen
やsystem
などの関数を使用して暗黙的にシェルを実行していない限り、パス名区切り文字以外をエスケープする理由はありません。
また、ファイル名がピリオドで始まらないように強制することもできます(これにより、Finderはファイルを非表示にします)。また、空ではなく、長さがNAME_MAX
文字*未満であることも強制する必要があります。
* syslimits.h
はバイトを言いますが、ファイルマネージャーを経由すると、それは文字です。どちらがココアに適しているかわかりません。
これにより、Ismailの無効な文字セットに基づいて、ファイル名内のすべての無効な文字が削除されます(彼のセットがどれだけ完全であるかは確認していません)。
- (NSString *)_sanitizeFileNameString:(NSString *)fileName {
NSCharacterSet* illegalFileNameCharacters = [NSCharacterSet characterSetWithCharactersInString:@"/\\?%*|\"<>"];
return [[fileName componentsSeparatedByCharactersInSet:illegalFileNameCharacters] componentsJoinedByString:@""];
}
ComponentsSeparatedByCharactersInSetを使用するというアイデアについては、Peter NLewisの功績によるものです。
NSString-純粋なアルファベットのみに変換します(つまり、アクセントと句読点を削除します)
ソリューションSwift 4
extension String {
var sanitizedFileName: String {
return components(separatedBy: .init(charactersIn: "/\:\?%*|\"<>")).joined()
}
}
使用法:
"https://myurl.com".sanitizedFileName // = httpsmyurl.com
NSURL *fileURL = [NSURL fileURLWithPath:yourFilePath isDirectory:NO];
if (fileURL) {
NSError *error;
fileURL = [NSURL URLByResolvingAliasFileAtURL:fileURL options:(NSURLBookmarkResolutionWithoutUI | NSURLBookmarkResolutionWithoutMounting) error:&error];
}
/ Users/XXX/Desktop /〜!@#$%^&*()_ + `-= {} |" <>?[] \; '、。:{} <>:^。png
file:/// Users/johnny/Desktop /〜!@%23 $%25%5E&*()_ +%60-=%7B%7D%7C%22%3C%3E%3F%5B%5D%5C %3B '、。:%20%20%7B%7D%3C%3E%5C:%5E%20.png
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("-")
}
}
ここ から参照されている不正な文字セット。
そしてもちろん、任意のヘイトリスト(他の回答から盗まれた)を持つ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("")
}