【问题标题】:Long path/filename in windows makes write.table() error out in RWindows 中的长路径/文件名在 R 中导致 write.table() 错误
【发布时间】:2014-10-01 21:57:20
【问题描述】:

在 R 中,我使用 write.table() 将文件写入嵌入在长名称目录中的位置。但错误如下:

文件中的错误(文件,ifelse(追加,“a”,“w”)): 无法打开连接 另外:警告信息: 在 file(file, ifelse(append, "a", "w")) : 无法打开文件 'data/production/Weekly_Prod_201407_Selling_Price_Snapshot_20140930_Median_Selling_Price_Map.csv':没有这样的文件或目录

然后,当我将文件名缩短为 Weekly_Prod.csv 时,它起作用了!所以看起来长路径和长文件名导致 R 出错。

我测试了几次,发现路径+文件名的总长度限制为260个字符。也就是说,当它是 261 个字符或更多时,R 会出错。有没有办法解决这个问题?请帮忙。谢谢!

【问题讨论】:

  • 什么操作系统?什么R版本?分享sessionInfo()的结果。这些目录是否已经存在?
  • @RichardScriven 这是write.table的源代码。
  • Windows 7 64 位,R x64 3.1.1,R Studio 0.98.1028。
  • sessionInfo(): > sessionInfo() R 版本 3.1.1 (2014-07-10) 平台:x86_64-w64-mingw32/x64(64 位)语言环境:[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252 LC_NUMERIC=C [5] LC_TIME=English_United States.1252 附加基础包:[1] tcltk stats graphics graphics grDevices utils datasets methods base other connected packages: [1] sqldf_0 .4-7.1 RSQLite.extfuns_0.0.1 RSQLite_0.11.4 DBI_0.2-7 gsubfn_0.6-5 proto_0.3-10 ...
  • 是的。这些目录已经存在于服务器上。是团队共享的位置,所以有很多子目录。

标签: r long-filenames


【解决方案1】:

windows上的文件路径长度有限制:

> write(1, paste0(paste(sample(letters, 150, TRUE), collapse = ''), '.txt'))
> write(1, paste0(paste(sample(letters, 250, TRUE), collapse = ''), '.txt'))
Error in file(file, ifelse(append, "a", "w")) : 
  cannot open the connection
In addition: Warning message:
In file(file, ifelse(append, "a", "w")) :
  cannot open file 'qvxirpnlwkqfwlxhggkscxlwhhyblrwxfpikpsukrfqwhaqvsyhdpihnoknqmxgafvawxkuijqbmvgdjwwgeumfksmhtiqwvzwmjukmmmeesvcdpdbpimarxssnrngfxwjksqshjruralhtwdnfmdhzrcwcdrnwezdhwqyisbjikdhbbygtcoeechgwrewenewbrlexliiikdnwlclbzllaxcohacadxzztgmtnmppyxtxtbopxdokjnvx.txt': No such file or directory

根据此来源,它是 260 个字符

http://msdn.microsoft.com/en-us/library/aa365247.aspx#maxpath

> nchar(getwd())
[1] 23
> write(1, paste0(paste(sample(letters, 231, TRUE), collapse = ''), '.txt'))
> write(1, paste0(paste(sample(letters, 232, TRUE), collapse = ''), '.txt'))
Error in file(file, ifelse(append, "a", "w")) : 
  cannot open the connection
In addition: Warning message:
In file(file, ifelse(append, "a", "w")) :
  cannot open file 'topylmudgfnrkdilqbklylwtbwrgwbwmamxzhwwzlxxslqeuhpywahoxqxpkckvmkfjccbsqncctlovcnxctkyvgunnbqcwyiliwpfkjibanpmtupsxfboxnjaadovtdpxeloqjnbqgvkcilwljfswzlrlqixmwqpoemcemhdizwwwbgqruhepyrskiklkbylzjhrcchbusohkrwyzgablvngqrqiardubcbziex.txt': No such file or directory
> getwd()
[1] "C:/Users/john/Documents"

> nchar(file.path(getwd(), paste0(paste(sample(letters, 231, TRUE), collapse = ''), '.txt')))
[1] 259

一种可能对您有用的解决方案是为您的长目录路径创建一个虚拟驱动器。它应该给你一点回旋余地,见https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/subst.mspx?mfr=true

> system("subst x: C:/Users/john/Documents")
> write(1, paste0("x://", paste(sample(letters, 251, TRUE), collapse = ''), '.txt'))

当你完成虚拟驱动器后,你可以使用:

system("subst x: /D")

【讨论】:

  • 这包括 OP 可能没有列出的子目录
  • 我没有在我的问题中输入完整路径,我已经使用 setwd() 来设置父目录。但正如我所说,只要文件路径超过 260,它就会出错。
  • 好的。它是 Windows 和 Mac 用户共享的服务器位置。所以显然 Mac 用户可以超过 260 个字符来保存文件。我仍然想知道是否有可能在 Windows 上解决这个问题。它已经是 64 位了。
  • 你可以尝试为你的服务器文件夹创建一个虚拟路径
  • 谢谢。我会根据这个网站ss64.com/nt/subst.html进行测试。根据它,对于网络路径,它是“net use”而不是“subst”。
【解决方案2】:

这可以通过将所述文件的名称替换为其短文件名 (SFN)(也称为 8.3 文件名)来解决。 p>

在文件所在目录的命令提示符下键入dir /x,这将列出目录中所有文件的SFN

然后将代码中的文件名替换为其对应的 8.3 文件名。

【讨论】:

  • 我认为这仅适用于使用任何 FAT 文件系统格式化的驱动器。我认为 NTFS 没有 SFN
【解决方案3】:

这不是 R 的错误,而是 Windows 施加的限制。从 Windows 10 开始,可以解除 260 个限制(达到 32,767 个字符)。根据this article

在 Windows API 中...路径的最大长度为 MAX_PATH,定义为 260 个字符。

从 Windows 10 版本 1607 开始,MAX_PATH 限制已从常见的 Win32 文件和目录函数中删除。但是,您必须选择加入新行为。

文章说明了如何选择接受更长的路径长度限制。我刚刚这样做了,重新启动了我的计算机,现在我没有收到该错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2011-10-10
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    相关资源
    最近更新 更多