iOS文件名中允许使用哪些字符?

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:)一次.

斯威夫特3和4

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)

斯威夫特2

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)


Eri*_*k B 9

首先,你使用的是错误的方法.修剪字符串只会删除字符串开头和结尾的字符.

您正在寻找的更像是:

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)


Gro*_*oot 8

此字符串扩展名 (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)


Ang*_*nov 7

由于我在这个问题中没有看到包含允许字符的列表,但问题想要一个包含这些字符的列表,我在这个主题上添加了更多细节.

首先,我们需要知道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方法的原因是它对我来说似乎过于严格.我不想将我的用户仅限制为拉丁字符.他们不妨使用一些中文,西里尔文或其他任何他们喜欢的东西.

快乐的编码!