如何让Directory.GetFiles()正确访问网络文件夹?
解决Directory.GetFiles将UNC路径转为本地C盘路径的问题
这个问题的核心是你从appSettings读取的targetFolder路径格式不正确,导致Directory.GetFiles()把它当成了相对路径,从而拼接上了当前程序的工作目录(恰好是C盘根目录),最终变成了C:\\myNetwork\\...。
原因分析
当你的配置中写的是\\myNetwork\\Project\\TargetFolder\\时,在不同的配置文件格式里,实际读取到的字符串可能会丢失一个开头的反斜杠,变成\myNetwork\Project\TargetFolder\。这种单个开头反斜杠的路径会被视为相对于当前工作目录的相对路径,而不是UNC网络共享路径。
解决方案
1. 修正配置文件中的路径写法
根据你使用的配置文件类型调整:
- app.config(XML格式):
XML中反斜杠不需要转义,但如果要表示UNC路径的两个开头反斜杠,需要写成四个反斜杠(因为C#字符串转义的逻辑):<appSettings> <add key="TargetFolder" value="\\\\myNetwork\\Project\\TargetFolder\\" /> </appSettings> - appsettings.json:
JSON中反斜杠必须转义,所以每个反斜杠都要写成两个,UNC路径的开头需要四个反斜杠:{ "TargetFolder": "\\\\myNetwork\\\\Project\\\\TargetFolder\\\\" }
2. 代码层面添加路径校验与修正
即使配置文件写对了,也可以在代码中添加一层校验,确保路径是正确的UNC格式:
// 读取配置(针对传统.NET Framework) string targetFolder = ConfigurationManager.AppSettings["TargetFolder"]; // 针对.NET Core/.NET 5+的写法: // string targetFolder = builder.Configuration.GetValue<string>("TargetFolder"); // 校验并修正路径:如果是单个开头反斜杠,补成两个 if (!string.IsNullOrWhiteSpace(targetFolder)) { targetFolder = targetFolder.TrimStart(); if (targetFolder.StartsWith(@"\") && !targetFolder.StartsWith(@"\\")) { targetFolder = @"\\" + targetFolder.Substring(1); } } // 现在调用Directory.GetFiles就会正确识别为UNC路径了 string[] array2 = Directory.GetFiles(targetFolder, "*.zip");
3. 额外注意事项
- 确保运行程序的用户账号有权限访问
\\myNetwork\Project\TargetFolder\这个网络共享文件夹,否则即使路径正确也会访问失败。 - 可以用
Path.IsPathRooted(targetFolder)快速判断路径是否为绝对路径,如果返回false,说明路径格式大概率有问题,需要进一步处理。
内容的提问来源于stack exchange,提问作者N0xus
相关产品推荐
相关产品推荐

