我正在使用非常棘手的战斗方法:)使像Fi?le*/ Name
这样的字符串可以安全地用作File_Name
这样的文件名。
我敢肯定有一种可可的方式来转换它。我相信最好的地方就是:)
谢谢!
答案 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)
除非您通过使用popen
或system
之类的函数显式运行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];
这样你仍然可以允许有破折号的文件名等。