9

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

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

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

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

4

2 回答 2

10

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")
于 2014-10-01T22:21:50.280 回答
1

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

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

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

于 2015-05-18T14:56:42.293 回答