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

File.OpenRead() throws UnauthorizedAccessException when a directory with same path exists

在网络共享上的文件上调用 File.OpenRead() 时,其中存在同名(但大小写不同)的文件夹,UnauthorizedAccessException。这可能发生在 Linux 个大小写重要的共享上。

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

以下代码将抛出:

const string path = @"P:\files\OUTPUT";

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);

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

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

这是默认值 SAMBA behaviour:

That which is lexically first will be accessible to MS Windows users; the others are invisible and unaccessible any other solution would be suicidal.

唯一安全的选择是为文件夹和文件使用不同的名称。试图确保其中一个或另一个在词汇上首先是(根据文档)......自杀。

编辑

从评论来看,记事本似乎可以打开正确的文件。尽管它看起来很简单,但记事本在处理复杂情况时做了 很多 的工作,例如在没有 BOM 可用时检测文件。

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

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

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