如何使NSStringpath(文件名)安全

我正在使用非常棘手的战斗方法:)使string像Fi?le*/ Name安全使用作为文件名称,如File_Name 。 我确定有一种cocoa方法来转换它。 我相信最好的地方是在这里:)

谢谢!

除非你明确地运行shell或者使用诸如popensystem类的函数隐式地运行shell,否则除了path名分隔符之外没有任何理由要转义任何东西。

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

* syslimits.h表示字节,但如果你通过文件pipe理器,它是字符。 我不确定哪一个是cocoa的。

这将删除基于Ismail的无效字符集(我还没有证实他的设置是如何完成的)在文件名中的任何地方的无效字符。

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

相信Peter N Lewis提出了使用componentsSeparatedByCharactersInSet的想法:
NSString – 仅转换为纯字母(即删除重音+标点符号)

 NSURL *fileURL = [NSURL fileURLWithPath:yourFilePath isDirectory:NO]; if (fileURL) { NSError *error; fileURL = [NSURL URLByResolvingAliasFileAtURL:fileURL options:(NSURLBookmarkResolutionWithoutUI | NSURLBookmarkResolutionWithoutMounting) error:&error]; } 

传输前:

/ Users / XXX / Desktop /〜!@#$%^&*()_ +` – = {} |“<>?[] \;',。:{} <>:^ .png

转移后:

文件:///用户/约翰尼/桌面/〜@%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

当然,还有一个随便的仇恨列表(从其他答案中被盗)。 那家伙是我:

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

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

非法字符集从这里引用。

在Swift中的解决scheme4

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

用法:

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

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

?/ \%* |“<>

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

鉴于此,并且由于替代解决scheme中的倒置操作可能是密集型的,所以下面是更清洁的方法:

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

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