43

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

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

4

7 に答える 7

68

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

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

componentsSeparatedByCharactersInSet:
NSString - 純粋なアルファベットのみに変換 (つまり、アクセントと句読点を削除)

于 2011-02-08T23:43:07.077 に答える
16

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

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

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

于 2009-08-15T10:26:06.347 に答える
4

私は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から参照されている文字セットが不正です。

于 2016-09-11T11:27:23.153 に答える
2

そしてもちろん、恣意的な憎悪リスト(他の回答から盗まれた)を持つs​​wift2の男がいるに違いありません。その男は私です:

func sanitizedString(string : String) -> String {
    // put anything you dislike in that set ;-)
    let invalidFsChars = NSCharacterSet(charactersInString: "/* <>?%|")
    let components = string.componentsSeparatedByCharactersInSet(invalidFsChars)
    return components.joinWithSeparator("")
}
于 2016-09-09T17:35:11.263 に答える
-3

ウィキペディアによると、ファイル名から除外する必要がある最も一般的な文字は次のとおりです。

/\?%*|"<>

http://en.wikipedia.org/wiki/ファイル名

それを考えると、代替ソリューションのinvertedSet操作は集中的になる可能性があるため、私にとっては以下がよりクリーンなアプローチです:

NSCharacterSet *invalidFsChars = [NSCharacterSet characterSetWithCharactersInString:@"/\\?%*|\"<>"];
NSString *scrubbed = [originalStr stringByTrimmingCharactersInSet:invalidFsChars];

このようにして、ダッシュなどを含むファイル名を引き続き許可できます。

于 2011-01-09T03:35:33.150 に答える