在网络共享上的文件上调用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);
有什么方法可以敏感地打开文件大小写?这不是重命名文件或移动文件夹的选项,因为这是一个只读共享。
答案 0 :(得分:1)
这是默认的SAMBA behaviour:
MS Windows用户可以访问词法首页。 其他解决方案将是隐形的,无法进入的 自杀。
唯一安全的选择是为文件夹和文件使用不同的名称。试图确保一个或另一个在词汇上是第一个(根据文档)...自杀。
修改强>
从评论中可以看出,记事本可以打开正确的文件。尽管外观简单,但Notepad可以处理复杂的情况,例如在没有BOM可用时检测文件。
它也可能使用长Unicode路径(例如\\?\P:\files\OUTPUT
)来访问文件,备用流和共享,或者它可能正在检测网络卷正在使用并切换到长路径格式。
System.IO
不支持这一点,因为它是特定于NTFS的,但是开源AlphaFS提供了对此的访问以及许多其他有用的NTFS功能,如事务和对象ID。
您可以使用AlphaFS使用长路径打开文件,但我没有尝试过。
答案 1 :(得分:-1)