Directory.GetFiles()路径找不到错误及无法访问父目录求助
解决相对路径找不到文件及父目录访问问题
嘿,我明白你现在的困扰——原本正常的代码突然找不到文件了,还碰到了父目录访问的问题。核心原因其实是程序运行的工作目录和你的项目根目录不一致:调试时默认工作目录是输出文件夹(bin\Debug\netcoreapp2.0),而不是你写代码的项目目录,所以你的相对路径input\patterns会指向输出目录下的对应文件夹,自然找不到。下面给你几个靠谱的解决办法:
方案1:直接修改调试工作目录(最简单)
你可以让调试时的工作目录直接指向项目根目录,这样原代码不用改就能跑:
- 右键你的项目 → 打开「属性」面板
- 切换到「调试」标签
- 在「工作目录」那栏输入
$(ProjectDir)(这是VS自带的宏,自动对应项目根目录) - 保存设置后重新调试,原来的
Directory.GetFiles(@"input\patterns", "*.json", SearchOption.AllDirectories)就能正常找到文件了
方案2:代码动态获取项目根目录(最可靠,适合发布后)
如果不想依赖IDE的设置,或者程序发布后也需要正确定位文件,用代码动态拼绝对路径是最好的选择:
// 从程序运行目录(bin/Debug/netcoreapp2.0)往上回溯到项目根 string projectRoot = Directory.GetParent(AppContext.BaseDirectory) .Parent.Parent.FullName; // 拼接input/patterns的绝对路径 string targetFolder = Path.Combine(projectRoot, "input", "patterns"); // 读取所有json文件 string[] files = Directory.GetFiles(targetFolder, "*.json", SearchOption.AllDirectories);
AppContext.BaseDirectory会返回当前程序运行的文件夹,我们通过三次Parent操作,依次跳出netcoreapp2.0→Debug→bin,最终到达项目根目录,这样不管程序在哪运行,都能精准找到目标文件夹。
方案3:把input文件夹复制到输出目录(适合静态资源)
如果input里的文件是程序运行时需要的静态资源(比如不会经常修改的配置文件),可以设置让VS编译时自动把它复制到输出目录:
- 右键项目里的
input文件夹 → 选择「属性」 - 在「复制到输出目录」下拉菜单里选「如果较新则复制」(或者「始终复制」)
- 编译完成后,
input文件夹会被同步到bin\Debug\netcoreapp2.0下,这时你的原相对路径代码就能正常工作了
关于“无法访问父文件夹”的补充
其实Directory.GetFiles()本身是支持访问父目录的,你之前可能用错了相对路径格式。比如在输出目录下,要访问项目根的input文件夹,相对路径应该写成@"../../input/patterns"(需要往上跳两级目录:从netcoreapp2.0到Debug,再到bin,然后到项目根),但这种写法很脆弱——一旦目录结构变化(比如换了.NET版本)就会失效,所以还是更推荐前面两种方案。
内容的提问来源于stack exchange,提问作者Zarif
相关产品推荐
相关产品推荐

