web-dev-qa-db-ja.com

NSStringパス(ファイル名)を安全にする方法

私は非常にトリッキーな戦闘方法を使用しています:)Fi?le*/ Nameのような文字列をFile_Nameのようなファイル名として安全に使用できるようにします。私はそれを変換するカカオの方法があると確信しています。そして、私は尋ねるのに最適な場所はここにあると確信しています:)

ありがとうございました!

42
cocoafan

シェルを明示的に実行しているか、popensystemなどの関数を使用して暗黙的にシェルを実行していない限り、パス名区切り文字以外をエスケープする理由はありません。

また、ファイル名がピリオドで始まらないように強制することもできます(これにより、Finderはファイルを非表示にします)。また、空ではなく、長さがNAME_MAX文字*未満であることも強制する必要があります。

* syslimits.hはバイトを言いますが、ファイルマネージャーを経由すると、それは文字です。どちらがココアに適しているかわかりません。

15
Peter Hosey

これにより、Ismailの無効な文字セットに基づいて、ファイル名内のすべての無効な文字が削除されます(彼のセットがどれだけ完全であるかは確認していません)。

- (NSString *)_sanitizeFileNameString:(NSString *)fileName {
    NSCharacterSet* illegalFileNameCharacters = [NSCharacterSet characterSetWithCharactersInString:@"/\\?%*|\"<>"];
    return [[fileName componentsSeparatedByCharactersInSet:illegalFileNameCharacters] componentsJoinedByString:@""];
}

ComponentsSeparatedByCharactersInSetを使用するというアイデアについては、Peter NLewisの功績によるものです。
NSString-純粋なアルファベットのみに変換します(つまり、アクセントと句読点を削除します)

66
johnboiles

ソリューションSwift 4

extension String {
    var sanitizedFileName: String {
        return components(separatedBy: .init(charactersIn: "/\:\?%*|\"<>")).joined()
    }
}

使用法:

"https://myurl.com".sanitizedFileName // = httpsmyurl.com
5
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

4
tyljohnny

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("-")
    }
}

ここ から参照されている不正な文字セット。

3
SeanR

そしてもちろん、任意のヘイトリスト(他の回答から盗まれた)を持つ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("")
}
2
Anton Tropashko