如何使NSStringpath(文件名)安全
我正在使用非常棘手的战斗方法:)使string像Fi?le*/ Name
安全使用作为文件名称,如File_Name
。 我确定有一种cocoa方法来转换它。 我相信最好的地方是在这里:)
谢谢!
除非你明确地运行shell或者使用诸如popen
或system
类的函数隐式地运行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];
这样你仍然可以允许有破折号的文件名等