Длинный путь / имя файла в Windows приводит к ошибке write.table() в R

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

Ошибка в файле (file, ifelse(append, "a", "w")): невозможно открыть соединение. Дополнительно: Предупреждение: в файле (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 символов или больше. Есть ли способ обойти это? Пожалуйста помоги. Спасибо!

3 ответа

Решение

Существует ограничение на длину пути к файлам в 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

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

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

Введите dir /x в командной строке над каталогом, в котором находится файл, в котором будут перечислены все SFN-файлы из каталога.

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

Это не ошибка R, а ограничение, наложенное Windows. Начиная с Windows 10 ограничение в 260 символов может быть увеличено (до 32767 символов). Согласно этой статье :

В Windows API... максимальная длина пути — MAX_PATH, которая определяется как 260 символов.

Начиная с Windows 10 версии 1607 ограничения MAX_PATH были удалены из общих функций файлов и каталогов Win32. Однако вы должны согласиться на новое поведение.

В статье приведены инструкции о том, как отказаться от более длинных ограничений длины пути. Я только что сделал это, перезагрузил компьютер, и теперь я не получаю эту ошибку.

Другие вопросы по тегам