Windows中的长路径/文件名使R中出现write.table()错误

smz*_*smz 5 r long-filenames

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

file(file,ifelse(append,“ 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个字符。也就是说,R大于等于261个字符时会出错。有办法解决这个问题吗?请帮忙。谢谢!

jdh*_*son 6

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
Run Code Online (Sandbox Code Playgroud)

根据此消息来源,这是260个字符

http://msdn.microsoft.com/zh-CN/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
Run Code Online (Sandbox Code Playgroud)

一种可能适用于您的解决方案是为您的长目录路径创建一个虚拟驱动器。它应该给您一些余地,请参阅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'))
Run Code Online (Sandbox Code Playgroud)

使用虚拟驱动器完成操作后,可以使用以下命令进行反向操作:

system("subst x: /D")
Run Code Online (Sandbox Code Playgroud)