无法访问文件夹名称末尾有多个连续空格的文件



我正在尝试以编程方式在有多个目录级别的网络服务器上定位一个文件,其中一个目录级别在名称末尾有两个空格。例如:

\MyServerC$TopLevelAccount someone@somewhere.comAFileName.pdf

请注意,帐户级别表示许多使用帐户代码作为文件夹名称的文件夹,其中大多数文件夹的末尾都有两个空格

我无法修改目录结构,因为它被我无法控制的其他进程使用。我会提前知道账户级别的路径,所以我需要在电子邮件级别的子文件夹中搜索文件名中包含订单号的文件。我也知道订单号。

问题是FileInfo、Directory和DirectoryInfo都对这两个空格犹豫不决。虽然Windows允许创建文件夹,并且自动化的第三方进程可以创建帐户级别以下的文件夹和文件,但到目前为止,我所尝试的一切都没有奏效,因为c#文件和目录类会剥离空间。

我不能使用:

Directory.GetFiles(PathToTopLevel, "*.pdf")

因为有1000多个帐户级文件夹,每个文件夹可能有5或6个电子邮件级文件夹,其中每个文件夹中可能有数百个pdf文件。我确实试过了,但在5分钟后它还在想的时候,我不得不把它杀死。

Directory.GetFiles(PathToAccountLevel, "*.pdf")  

这将返回"找不到路径的一部分"错误。

我也试过:

filePath = Path.Combine(PathToAccountLevel, $"{order_no}.pdf");  
var fi = new FileInfo(filePath);

它还返回"找不到部分路径"。

我在SO和其他论坛上做了很多搜索,但都没有成功,因为它们主要关注文件名或单个空格,但我确实在这里找到了一个我尝试过的有用方法:

filePath = AddQuotesIfRequired(PathToAccountLevel);  
Directory.GetFiles(filePath, "*.pdf")

这确实增加了引号,但对结果没有影响。

也尝试过(添加和不添加引号(:

Directory.GetFiles(@filePath, "*.pdf")  

我试过尽可能多地使用引号和"@"等组合,但到目前为止绝对没有效果。我甚至对电子邮件级别的完整路径进行了硬编码,但仍然没有任何乐趣。

我在Windows 10上使用带有VS2019的C#。服务器正在运行Windows server 2012 R2数据中心。我已经在服务器上本地运行了测试可执行文件,结果是一样的。

真正令人恼火的是,一个用delphi编写并使用FindFirst/Next的简单测试程序非常完美!

我还应该提到,权限不是问题,文件是存在的。

任何帮助都将是伟大的,谢谢。

关于qaabaam可能的重复/建议答案:

该问题的答案1不是有效代码-行

DirectoryInfo wantedDir = tempWithoutMac.GetDirectories.Where(c => c.Contains(MacID)).First();

由于GetDirectories是一个方法并且在上下文中无效,因此引发错误。如果将其更改为GetDirectories(),则会抱怨DirectoryInfo没有Contains的定义。

答案2使用alt0160仍然抛出找不到部分路径错误。

答案3基本上是一种观点,没有任何帮助。

如果你能想出如何让答案1发挥作用,我一定会试一试!

目录名中的前导或尾随空格是Windows中的灰色区域之一:您可以这样做,但可能不应该这样做。原因很简单——绝大多数情况下,前导空格或尾随空格都是拼写错误,而路径周围的Windows API都是为了考虑到这一点而设计的,以至于(正如你所发现的(它们会完全忽略前导空格或尾部空格。(例如,在Windows 10中,通过Windows资源管理器删除带有尾随空格的目录是不可能的!(由于C#是在这些API之上构建的,它继承了它们的";怪癖";。

幸运的是,有一种方法可以告诉Windows";不要试图修复这条路,这是正确的,我知道我在做什么"通过使用DOS设备路径。简而言之:

  • 对于本地路径,请在它们前面加上文字\?。换句话说,C:foobar将变成\?C:foobar
  • 对于UNC路径,请将前导\替换为\?UNC。换句话说,\serverfoobar将变成\?UNCserverfoobar

在您的情况下,您所需要做的就是将\MyServerC$TopLevelAccount 更改为\?UNCMyServerC$TopLevelAccount ,一切都应该如您所期望的那样工作。


顺便说一句,您正在做的是文档搜索/查询操作,它在执行I/O和通过网络执行I/O时会非常慢。最好编写一个工具将这些文档迁移到一个合适的数据库中,然后在该数据库中搜索文档。

最新更新