Con*_*has 21 filenames file character-encoding nsfilemanager ios
我正在寻找一种方法来确保字符串可以在iOS下用作文件名.我目前在删除不兼容字符的代码部分.我想知道我是否做得对.
NSString *filename = @"A file name";
fileName = [fileName stringByTrimmingCharactersInSet: [NSCharacterSet controlCharacterSet]];
fileName = [fileName stringByTrimmingCharactersInSet: [NSCharacterSet newlineCharacterSet]];
Run Code Online (Sandbox Code Playgroud)
我也想知道是否已经有一种方法可以将字符串验证为文件名.
感谢您的意见!
Abh*_*ert 28
使用RegEx:
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^a-zA-Z0-9_]+" options:0 error:nil];
filename = [regex stringByReplacingMatchesInString:filename options:0 range:NSMakeRange(0, filename.length) withTemplate:@"-"];
Run Code Online (Sandbox Code Playgroud)
Mar*_*rný 13
我发现这更清洁,可能性能更高.这是基于Angel Naydenov的解决方案,但首先使用所有无效字符构建字符集,然后调用components(separatedBy:)一次.
var invalidCharacters = CharacterSet(charactersIn: ":/")
invalidCharacters.formUnion(.newlines)
invalidCharacters.formUnion(.illegalCharacters)
invalidCharacters.formUnion(.controlCharacters)
let newFilename = originalFilename
.components(separatedBy: invalidCharacters)
.joined(separator: "")
Run Code Online (Sandbox Code Playgroud)
let invalidCharacters = NSMutableCharacterSet(charactersInString: ":/")
invalidCharacters.formUnionWithCharacterSet(NSCharacterSet.newlineCharacterSet())
invalidCharacters.formUnionWithCharacterSet(NSCharacterSet.illegalCharacterSet())
invalidCharacters.formUnionWithCharacterSet(NSCharacterSet.controlCharacterSet())
let filename = originalFilename
.componentsSeparatedByCharactersInSet(invalidCharacters)
.joinWithSeparator("")
Run Code Online (Sandbox Code Playgroud)
首先,你使用的是错误的方法.修剪字符串只会删除字符串开头和结尾的字符.
您正在寻找的更像是:
fileName = [fileName stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
Run Code Online (Sandbox Code Playgroud)
但是,这是一个次优解决方案,因为您必须为要排除的每个字符执行此操作,因此您可能希望继续查找或编写您自己的方法来操作字符串.
iOS是基于UNIX的,因此我认为它几乎支持文件名中的任何字符.UNIX允许使用空格,<,>,|,\,:,(,),&,;以及通配符,例如?和*,使用\符号引用或转义.但是,我不会在我的文件名中使用任何这些字符.事实上,我会将文件名中的字符限制为'a' - 'z','0' - '9','_'和'.'.
小智 9
我必须在本地保存远程文件,文件名包含除基本字母数字字符之外的其他字符.我使用下面的方法去掉潜在的无效字符,确保在使用URLWithString生成NSURL时它是文件系统的有效文件名:
filename = [[filename componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] componentsJoinedByString:@"" ];
filename = [[filename componentsSeparatedByCharactersInSet:[NSCharacterSet illegalCharacterSet]] componentsJoinedByString:@"" ];
filename = [[filename componentsSeparatedByCharactersInSet:[NSCharacterSet symbolCharacterSet]] componentsJoinedByString:@"" ];
fileURLString = [NSTemporaryDirectory() stringByAppendingPathComponent:filename];
fileURL = [NSURL URLWithString:fileURLString];
Run Code Online (Sandbox Code Playgroud)
您可能还希望首先使用以下方法测试碰撞错误:
[[NSFileManager defaultManager] fileExistsAtPath:[fileURL absoluteString]]
Run Code Online (Sandbox Code Playgroud)
此字符串扩展名 (Swift 4.2) 将帮助将无效的 iOS 文件名转换为有效的 iOS 文件名。
extension String {
func convertToValidFileName() -> String {
let invalidFileNameCharactersRegex = "[^a-zA-Z0-9_]+"
let fullRange = startIndex..<endIndex
let validName = replacingOccurrences(of: invalidFileNameCharactersRegex,
with: "-",
options: .regularExpression,
range: fullRange)
return validName
}
}
Run Code Online (Sandbox Code Playgroud)
例如
"name.name?/!!23$$@1asd".convertToValudFileName() // "name-name-23-1asd"
"!Hello.312,^%-0//\r\r".convertToValidFileName() // "-Hello-312-0-"
"/foo/bar/pop?soda=yes|please".convertToValidFileName() // "-foo-bar-pop-soda-yes-please"
Run Code Online (Sandbox Code Playgroud)
由于我在这个问题中没有看到包含允许字符的列表,但问题想要一个包含这些字符的列表,我在这个主题上添加了更多细节.
首先,我们需要知道iOS设备使用的文件系统是什么.使用多个在线资源,这似乎是HFSX,它是HFS +区分大小写的版本.并在此处提供一个链接供参考:https://apple.stackexchange.com/questions/83671/what-filesystem-does-ios-use
现在我们知道文件系统是什么,我们可以查找不允许的字符.这些似乎是:冒号(:)和斜杠(/).以下是供参考的链接:http://www.comentum.com/File-Systems-HFS-FAT-UFS.html
有了这些信息和其他人在这个帖子中写的内容,我个人偏好从文件名中删除不允许的字符是以下Swift代码:
filename = "-".join(filename.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet()))
filename = "-".join(filename.componentsSeparatedByCharactersInSet(NSCharacterSet.illegalCharacterSet()))
filename = "-".join(filename.componentsSeparatedByCharactersInSet(NSCharacterSet.controlCharacterSet()))
filename = "-".join(filename.componentsSeparatedByString(":"))
filename = "-".join(filename.componentsSeparatedByString("/"))
Run Code Online (Sandbox Code Playgroud)
我不喜欢RegEx方法的原因是它对我来说似乎过于严格.我不想将我的用户仅限制为拉丁字符.他们不妨使用一些中文,西里尔文或其他任何他们喜欢的东西.
快乐的编码!
| 归档时间: |
|
| 查看次数: |
18193 次 |
| 最近记录: |