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

时间:2015-03-09 12:26:47

标签: c# file-io unc

在网络共享上的文件上调用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);

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

2 个答案:

答案 0 :(得分:1)

这是默认的SAMBA behaviour

  

MS Windows用户可以访问词法首页。   其他解决方案将是隐形的,无法进入的   自杀。

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

修改

从评论中可以看出,记事本可以打开正确的文件。尽管外观简单,但Notepad可以处理复杂的情况,例如在没有BOM可用时检测文件。

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

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

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

答案 1 :(得分:-1)

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