如何使NSString路径(文件名)安全

时间:2009-08-15 10:09:03

标签: cocoa string nsstring filenames

我正在使用非常棘手的战斗方法:)使像Fi?le*/ Name这样的字符串可以安全地用作File_Name这样的文件名。 我敢肯定有一种可可的方式来转换它。我相信最好的地方就是:)

谢谢!

7 个答案:

答案 0 :(得分:66)

这将根据Ismail的无效字符集删除文件名中任何位置的所有无效字符(我尚未验证其设置的完整程度)。

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

感谢Peter N Lewis使用componentsSeparatedByCharactersInSet的想法:
NSString - Convert to pure alphabet only (i.e. remove accents+punctuation)

答案 1 :(得分:15)

除非您通过使用popensystem之类的函数显式运行shell或隐式运行shell,否则除了路径名分隔符之外没有理由转义任何内容。

您可能还希望强制文件名不以句号开头(这会导致Finder隐藏文件),并且可能还应该强制它不是空的且少于NAME_MAX个字符*长。

* syslimits.h表示字节,但如果您浏览文件管理器,则表示字符。我不确定哪个适合Cocoa。

答案 2 :(得分:5)

Swift 4中的解决方案

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

用法:

"https://myurl.com".sanitizedFileName // = httpsmyurl.com

答案 3 :(得分:4)

NSURL *fileURL = [NSURL fileURLWithPath:yourFilePath isDirectory:NO];

if (fileURL) {

    NSError *error;

    fileURL = [NSURL URLByResolvingAliasFileAtURL:fileURL options:(NSURLBookmarkResolutionWithoutUI | NSURLBookmarkResolutionWithoutMounting) error:&error];

}

转学前:

!?

/用户/ XXX /桌面/〜@#$%^&安培; *()_ +` - = {} |&#34;&LT;&GT; [] \;&#39;,: {}&lt;&gt;:^ .png

转让后:

文件:///用户/约翰尼/桌面/〜@%23 $%25%5E&安培; *()_ +%60 - =%7B%7D%7C%22%3C%3E%3F%5B %5D%5C%3B&#39;,:%20%20%7B%7D%3C%3E%5C:%5E%20.png

答案 4 :(得分:2)

当然,必须有一个随意的快速人 仇恨列表(从其他答案中窃取)。那家伙就是我:

func sanitizedString(string : String) -> String {
    // put anything you dislike in that set ;-)
    let invalidFsChars = NSCharacterSet(charactersInString: "/* <>?%|")
    let components = string.componentsSeparatedByCharactersInSet(invalidFsChars)
    return components.joinWithSeparator("")
}

答案 5 :(得分:2)

我在johnboiles's answer上迭代,转换为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引用的非法字符集。

答案 6 :(得分:-3)

根据维基百科,应从文件名中排除的最常见字符是:

/ \%* |“&LT;?&GT;

http://en.wikipedia.org/wiki/Filename

考虑到这一点,并且由于替代解决方案中的invertSet操作可能非常密集,对我来说,下面是一个更清晰的方法:

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

这样你仍然可以允许有破折号的文件名等。