R项目跨多级目录使用相对路径读取文件报错如何排查解决
问题原因
该问题和.Rproj对应的工作目录嵌套深度无直接关系,核心诱因是Windows系统默认的Win32 API路径长度限制:
- Windows默认对传统Win32程序的路径长度限制为260个字符(含路径终止空字符),超过该长度的路径,未适配长路径的程序会直接读取失败
list.files()由R核心层调用系统目录遍历接口实现,在Windows平台可正常识别超长路径下的文件,因此能正常返回文件名;但readxl包底层依赖的xls/xlsx解析库旧编译版本未适配长路径逻辑,路径总字符数超过阈值时就会读取失败- 你观察到的「路径到E层级可正常读取、到F层级读取失败」「文件上移一级即可正常读取」现象,本质是路径总字符数刚好在阈值边界浮动,和相对路径的
../层级数无直接关联。
补充:你代码里list.files的pattern参数写为.xslx属于笔误,正确后缀应为.xlsx,该笔误不影响本次问题定位。
解决方案
可根据实际场景选择以下任意一种方案修复:
- 缩短路径总长度
将项目目录向磁盘根目录移动、简化上层目录命名,把目标文件路径总字符数控制在260字符以内即可正常读取,你之前将文件上移一级读取成功就是该逻辑。 - 开启系统长路径支持(推荐长期使用)
- 按
Win+R输入gpedit.msc打开本地组策略编辑器,依次进入「计算机配置 > 管理模板 > 系统 > 文件系统」,找到「启用Win32长路径」选项设置为「已启用」,保存后重启电脑 - 将R升级到4.2及以上版本(该版本开始R核心原生支持Windows长路径),同时将
readxl包更新到最新版本,即可正常读取任意深度的路径文件。
- 按
- 用Windows短路径格式绕开限制
无需修改系统设置或移动文件,通过shortPathName()将超长路径转换为Windows兼容的8.3格式短路径,再传入读取函数即可,示例代码:
library(readxl) # 先将相对路径转换为标准绝对路径,再生成兼容短路径 target_file <- shortPathName(normalizePath("../../04/folder 1/test.xlsx", mustWork = TRUE)) df <- read_excel(target_file)
- 目录软链接映射
通过file.symlink()将存放数据的04目录映射到当前.Rproj所在目录下,后续读取时直接使用当前项目下的短路径即可,无需书写多层上级相对路径。
排查小技巧:可执行nchar(normalizePath("目标文件路径"))查看路径总字符数,若数值大于260即可确认是长路径限制问题。
内容的提问来源于stack exchange,提问作者deschen
相关产品推荐
相关产品推荐

