Длинный путь / имя файла в 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. Однако вы должны согласиться на новое поведение.
В статье приведены инструкции о том, как отказаться от более длинных ограничений длины пути. Я только что сделал это, перезагрузил компьютер, и теперь я не получаю эту ошибку.