2014-10-01 8 views
4

В R я использовал write.table(), чтобы записать файл в папку, встроенную в каталоги с длинными именами. Но это ошибки вне, как показано ниже:Длинный путь/имя файла в окнах вызывает ошибку write.table() в R

Ошибка в файле (файл, IfElse (добавить, «а», «ж»)): не может открыть соединение Дополнительно: Предупреждение сообщения: В файле (файл , IfElse (добавить, «а», «ж»)): не может «данные/производство/Weekly_Prod_201407_Selling_Price_Snapshot_20140930_Median_Selling_Price_Map.csv» открыть файл: нет такого файла или каталога

Затем, когда я сократил имя файла Weekly_Prod.csv, его работал! Таким образом, кажется, что длинный путь и длинное имя файла вызвали ошибку R.

Я проверил его несколько раз и обнаружил, что предел составляет 260 символов для общей длины пути + имя файла. То есть, R ошибки, когда это 261 символов или больше. Есть ли способ обойти это? Пожалуйста помоги. Благодаря!

+0

Что такое ОС? Какая версия R? Поделитесь результатами 'sessionInfo()'. И эти каталоги уже существуют? – MrFlick

+0

@RichardScriven Это источник для 'write.table'. – MrFlick

+0

Windows 7 64bit, R x64 3.1.1, R Studio 0.98.1028. – smz

ответ

4

Существует ограничение на файл длины пути на окнах:

> 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") 
+0

Сюда входят подкаталоги, которые OP может не иметь – jdharrison

+0

Я не задал полный путь в своем вопросе, где я уже использовал setwd() для установки родительского каталога. Но, как я уже сказал, он выдает ошибку, когда путь к файлу выходит за пределы 260. – smz

+0

Хорошо. Это местоположение сервера, совместно используемое пользователями Windows и Mac. Таким образом, очевидно, что пользователи Mac могут выходить за пределы 260 символов для сохраненных файлов. Мне все еще интересно, можно ли обойти это в Windows. Это уже 64 бит. – smz

0

Это может позаботиться, заменив имя указанного файл с его Краткое имя файла (SFN), также известный как 8.3 имя файла.

Тип реж/х в командной строке над каталогом, в котором находится файл, который можно было бы перечислить все SFN «s файлов в директории.

Затем замените имя файла в вашем коде соответствующим его именем 8.3.