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

coc*_*fan 42 string cocoa filenames nsstring

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

谢谢!

joh*_*les 66

这将根据Ismail的无效字符集删除文件名中任何位置的所有无效字符(我还没有验证他的设置是否完整).

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

感谢Peter N Lewis使用componentsSeparatedByCharactersInSet的想法:
NSString - 仅转换为纯字母(即删除重音符号+标点符号)

  • OSX上文件名的唯一非法字符是`/`和`:`. (9认同)
  • 仅供参考,至少在Yosemite,我可以在OS X文件名中使用`/`.`:`仍然无效.此外,`illegalFileNameCharacters`中的所有字符在OSX中似乎都是合法的 (3认同)

Pet*_*sey 15

除非您显式运行shell或使用popenor 等函数隐式运行shell,否则system除了路径名分隔符之外没有理由转义任何内容.

您可能还希望强制文件名不以完全停止开始(这会导致Finder隐藏文件),并且可能还应该强制它不为空且少于NAME_MAX字符*long.

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


Cha*_*tas 5

Swift 4中的解决方案

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

用法:

"https://myurl.com".sanitizedFileName // = httpsmyurl.com
Run Code Online (Sandbox Code Playgroud)