【问题标题】:Converting user input string into a valid file name将用户输入字符串转换为有效的文件名
【发布时间】:2013-03-04 08:20:23
【问题描述】:

在 iOS 上将用户输入字符串转换为有效文件名时需要考虑哪些特殊注意事项?有什么方法可以提供帮助吗?我在 NSStringNSFileManager 上找不到任何明显的东西。

上下文允许用户在应用内保存搜索。在幕后,这些名称被转换为 Core Data 持久存储的名称。实际的文件名永远不会暴露给用户。

提前致谢。

【问题讨论】:

  • 如果文件仅适用于 iOS,则唯一的无效字符是斜线 (/)。
  • @maddy nul ('\0') 也被禁止。
  • @NikolaiRuhe 是的。但问题在于用户可以在应用程序中输入的字符。我从未在 iOS 键盘上看到过 nul 字符。 :)
  • 如果我们知道这些文件名的用途,这将有助于我们针对您的具体情况提供更好的答案。
  • @rmaddy 永远不要忘记粘贴。如果您允许用户输入,请确保已正确清理。

标签: ios objective-c cocoa-touch nsstring nsfilemanager


【解决方案1】:

如果您只是保存搜索,则不需要文件或文件名。有几种方法可以做到这一点,但为什么不直接使用 Core Data 来保存搜索呢?您可以有一个“搜索”实体并将所有相关信息存储在那里。

不需要文件,而且您显然已经掌握了使用核心数据的速度,所以在这里也可以使用它。

【讨论】:

  • 为什么将文件名限制为小写 a-z?使用不同字母(日语、俄语、希腊语等)的语言的用户会怎样?如果文件保留在设备上,则用户可以键入的符号很少不应该是文件名的一部分。
  • 我的意思不仅仅是小写,它应该是他认为合理的文件名字符。我会编辑,我显然不打算排除大写字母。关键是,我个人不允许特殊字符,无论它们对文件名是否有效。
  • 您需要解释为什么文件名应该受到如此限制的原因。我有一个应用程序,它几乎允许用户在 iOS 键盘上键入每个 Unicode 字符,并且这些文件工作得很好。
  • 不,我不需要解释它,这是我的意见和建议,但例如,当这个文件进入另一个可能支持或不支持某些特殊字符的操作系统时会发生什么?你的文件名中真的需要一个'
  • 这是一个完全有效且实用的解决方案。我不明白反对意见。
【解决方案2】:

主要关注点应该是用户体验:用户可以键入任何内容来识别文件。回到数据时,她希望看到与她输入的字符串完全相同的字符串。

处理此信息的最佳方法是将实际输入存储在其他位置,并使用映射来获取实际文件。

您可以只使用保存在 plist 文件中的字典。字典将包含用户输入作为键和 UUID 作为值。然后使用 UUID 作为文件名保存该文件。这样您就可以确保文件名始终有效,并且用户可以键入任何她想要的内容,而不必担心文件名无效。

与仅去除无效字符相比,一个优点是用户可以使用例如“/”和“//”作为有效标识符,如果她愿意的话。

【讨论】:

    【解决方案3】:

    替换非法字符。像这样的:

    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];
    

    检查文件是否存在。像这样的:

    [[NSFileManager defaultManager] fileExistsAtPath:[fileURL absoluteString]]
    

    【讨论】:

    • 文件名中允许有空格。用户不能输入来自illegalCharacterSet 的任何字符。并且允许使用许多符号。
    • 仅仅删除不需要的字符就有无意中访问错误文件的危险。用户希望“foo ... bar”与“foobar”不同,但在您的代码中它们标识相同的文件。
    猜你喜欢
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2015-10-04
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多