File.OpenRead() 在存在具有相同路径的目录时抛出 UnauthorizedAccessException



当对存在具有相同名称(但大小写不同)的文件夹的网络共享上的文件调用File.OpenRead()时,UnauthorizedAccessException 。这可能发生在大小写很重要的 Linux 共享上。

例:* P:映射到\somemachine\someshare* P:\files\ 是一个文件夹* P:\files\OUTPUT 是一个文件* P:\files\output 是一个文件夹

以下代码将引发:

const string path = @"P:filesOUTPUT";
DirectoryInfo dir = new DirectoryInfo(Path.GetDirectoryName(path));
FileInfo file = dir.EnumerateFiles().FirstOrDefault(x => string.Equals(Path.GetFileName(path), x.Name));
// All of the below throws UnauthorizedAccessException            
file.OpenRead(); 
FileStream stream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
File.OpenRead(path);

有什么方法可以敏感地打开文件大小写吗?重命名文件或移开文件夹不是一个选项,因为这是只读共享。

这是默认的 SAMBA 行为:

在词法上首先的内容将可供MS Windows用户访问; 其他的是不可见的,无法访问任何其他解决方案都是 自杀。

唯一安全的选择是对文件夹和文件使用不同的名称。试图确保其中一个在词法上是第一位的(根据文档)......自杀。

编辑

从注释中可以看出,记事本似乎可以打开正确的文件。尽管外观简单,但记事本在处理复杂情况方面做了很多工作,例如在没有 BOM 可用时检测文件。

它还可能使用长Unicode路径(例如\?P:filesOUTPUT)来访问文件,备用流和共享,或者它可能检测到网络卷正在使用并切换到长路径格式。

System.IO不支持此功能,因为它特定于NTFS,但是开源AlphaFS提供了对此以及许多其他有用的NTFS功能的访问,例如事务和对象ID。

您可以使用 AlphaFS 通过长路径打开文件,尽管我还没有尝试过。

  1. 检查文件的安全访问权限。

最新更新