【问题标题】:How can I check if a string is a valid file name for windows using R?如何检查字符串是否是使用 R 的 Windows 的有效文件名?
【发布时间】:2013-06-23 15:51:19
【问题描述】:

我一直在用 R 编写一个程序,该程序为我今年夏天与其他几个人合作的一个研究项目输出随机化方案,我已经完成了大部分工作,除了一个功能。我一直在做的部分工作是让它真正对用户友好,以便程序会提示用户输入某些信息,从而知道需要随机化的内容。我将其设置为检查每条用户输入以确保它是有效输入,如果不是,则再次提供错误消息/提示用户。我唯一不能弄清楚的是如何让它检查 .csv 输出的文件名是否有效。有谁知道是否有办法让 R 检查字符串是否为有效的 Windows 文件名?谢谢!

【问题讨论】:

  • 尝试创建文件。如果它成功了,你就可以走了。如果它失败了,你就没有。
  • 两种可能性:@DavidHeffernan 建议的错误处理(使用try/tryCatch)。或者非常严格,只允许使用字母数字字符。
  • 这里给出了规则:msdn.microsoft.com/en-us/library/windows/desktop/… 但我认为在这种情况下请求宽恕比许可更好

标签: windows r filenames


【解决方案1】:

这些字符是不允许的:/\:*?"<>|。因此,如果它包含其中任何一个,请警告用户。

也不允许使用其他一些名称:COMAUXNULCOM1COM9LPT1LPT9

您可能希望使用正则表达式检查文件名是否有效。请参阅此其他答案以获取 Java 示例,该示例应在 R 中进行最少的调整。 https://stackoverflow.com/a/6804755/134830

您可能还想检查文件名长度(260 个字符以获得最大的可移植性,但在某些系统上允许使用更长的名称)。

最后,在 R 中,如果你尝试在不存在的目录中创建文件,它仍然会失败,因此你需要将名称拆分为文件名和目录名(使用 basename 和 @ 987654331@),如有必要,请先尝试创建目录。

也就是说,David Heffernan 在他的评论中给出了很好的建议,让 Windows 来决定它是否可以创建文件:你不想错误地告诉用户文件名无效。

你想要这样的东西:

nice_file_create <- function(filename)
{
  directory_name <- dirname(filename)
  if(!file.exists(directory_name))
  {
    ok <- dir.create(directory_name)
    if(!ok)
    {
      warning("The directory of that path could not be created.")
      return(invisible())
    }
  }
  tryCatch(
    file.create(filename),
    error = function(e)
    {
      warning("The file could not be created.")
    }
  )
}

但首先要彻底测试!有各种各样的边缘情况可能会失败:尝试 UNC 网络路径名、“~”和带有“.”的路径。和其中的“..”。

【讨论】:

    【解决方案2】:

    我建议确保文件名有效的最简单方法是使用fs::path_sanitize()

    它删除控制字符、保留字符和 Windows 保留的文件名,截断长度为 255 字节的字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-03
      • 2010-09-08
      • 2018-03-21
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 2011-03-09
      相关资源
      最近更新 更多