从NSString创建一个安全的文件名?

时间:2011-08-10 17:04:40

标签: iphone ios ios4 nsstring

是否可以使用NSString并将其转换为安全版本,可以将其用作文件名以保存到iPhone上的用户文档目录。

我现在正在做这样的事情:

NSString *inputString = @"This is sample text which may have funny chars and spaces in.";

NSInteger len = [inputString length];        
NSString *newFilename = [[inputString substringToIndex:MIN(20, len)] stringByAppendingPathExtension:@"txt"];

这让我有了类似的东西:

This is sample text .txt

需要确保文件名中不允许使用的字符并将其删除。

3 个答案:

答案 0 :(得分:5)

你可能会得到一些正则表达式或其他东西。仅仅因为使用except - 过滤器太危险了(你可能会错过一些非法的字符)。

因此我建议您使用RegexKitLite(http://regexkit.sourceforge.net/RegexKitLite/),并结合以下代码行:

inputString = [inputString stringByReplacingOccurencesOfRegex:@"([^A-Za-z0-9]*)" withString:@""];

这将替换除A-Z,a-z和0-9 =)之外的所有字符!

答案 1 :(得分:3)

你也可以用老式的方式来做,而不是使用正则表达式:

NSString* SanitizeFilename(NSString* filename)
{
    NSMutableString* stripped = [NSMutableString stringWithCapacity:filename.length];
    for (int t = 0; t < filename.length; ++t)
    {
        unichar c = [filename characterAtIndex:t];

        // Only allow a-z, A-Z, 0-9, space, -
        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') 
        ||  (c >= '0' && c <= '9') || c == ' ' || c == '-')
            [stripped appendFormat:@"%c", c];
        else
            [stripped appendString:@"_"];
    }

    // No empty spaces at the beginning or end of the path name (also no dots
    // at the end); that messes up the Windows file system.
    return [stripped stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

答案 2 :(得分:-1)

如果您真正需要的是一个安全随机的文件名,那么只需使用SecRandomCopyBytes到您想要的长度并对其进行base64编码。