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);
有什么方法可以敏感地打开文件大小写吗?无法重命名文件或将文件夹移开,因为这是只读共享。
- 检查文件的安全访问权限。
这是默认值 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 使用长路径打开文件,尽管我还没有尝试过。
在网络共享上的文件上调用 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);
有什么方法可以敏感地打开文件大小写吗?无法重命名文件或将文件夹移开,因为这是只读共享。
- 检查文件的安全访问权限。
这是默认值 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 使用长路径打开文件,尽管我还没有尝试过。