UnauthorizedAccessException 无法解决 Directory.GetFiles 失败
Directory.GetFiles 方法 在第一次遇到不存在的文件夹时失败的访问权。
该方法会抛出 UnauthorizedAccessException(可以捕获),但在完成此操作时,该方法已经失败/终止。
我正在使用的代码如下所示:
try
{
// looks in stated directory and returns the path of all files found
getFiles = Directory.GetFiles(
@directoryToSearch,
filetype,
SearchOption.AllDirectories);
}
catch (UnauthorizedAccessException)
{
}
据我所知,没有办法事先检查某个文件夹是否定义了访问权限。
在我的示例中,我正在通过网络搜索磁盘,当我遇到仅限根访问的文件夹时,我的程序失败。
Directory.GetFiles method fails on the first encounter with a folder it has no access rights to.
The method throws an UnauthorizedAccessException (which can be caught) but by the time this is done, the method has already failed/terminated.
The code I am using is listed below:
try
{
// looks in stated directory and returns the path of all files found
getFiles = Directory.GetFiles(
@directoryToSearch,
filetype,
SearchOption.AllDirectories);
}
catch (UnauthorizedAccessException)
{
}
As far as I am aware, there is no way to check beforehand whether a certain folder has access rights defined.
In my example, I'm searching on a disk across a network and when I come across a root access only folder, my program fails.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
为了获得所需级别的控制,您可能应该一次探测一个目录,而不是一整棵树。以下方法使用目录树中找到的所有文件填充给定的
IList
(用户无权访问的文件除外):In order to gain control on the level that you want, you should probably probe one directory at a time, instead of a whole tree. The following method populates the given
IList<string>
with all files found in the directory tree, except those where the user doesn't have access:我知道这个线程已经很旧了,但是如果有人偶然发现这个问题并需要答案,我在这里得到了一个递归解决方案:
它返回一个
List
,其中包含所有文件的完整路径给定根目录下的可访问目录。这样称呼它:
所以一个结果可能是这样的:
希望它可以帮助某人!
I know this thread is old, but in case someone stumbles upon this and needs an answer, i got a recursive solution here:
It returns an
List<string>
containing the full path to all files that are in accessible directories below the given root-directory.Call it like this:
So one result could be like this:
Hope it helps someone!
这是对马尔科姆答案的增强(http://stackoverflow.com/a/9831340/226181)。这会扫描所有逻辑驱动器以查找文件匹配模式,并忽略不可访问的目录。
This is an enhancement to Malcolm's answer (http://stackoverflow.com/a/9831340/226181). This scans all logical drives for a file match pattern and ignores the directories that are not accessible.
最简单的版本:
The simplest version:
.Net 4 的 Directory.EnumerateFiles 确实可以工作,但是您必须小心如何评估可枚举值并在 try-catch 块内执行该部分。最大的问题是确保你不会在第一个异常时停止处理(我认为答案https://stackoverflow.com/a上面的/1393219/89584就有这个问题,如果有错请指正)。
以下内容可以为您提供一个可枚举的值,因此如果您正在寻找第一个匹配项等,则不必评估整个文件树。
对上述欢迎的改进。
.Net 4's Directory.EnumerateFiles does work, but you've got to be careful how you evaluate the enumerable and do that part inside the try-catch block. The biggest issue is making sure you don't stop processing at the first exception (which I think answer https://stackoverflow.com/a/1393219/89584 above has this problem, please correct me if I'm wrong there).
The following works and gives you an Enumerable so you don't have to evaluate the entire file tree if you're looking for the first match, etc.
improvements to the above welcome.
这是我对这个问题的解决方案。简单且安全。
This is my solution for this problem. Simple and fail safe.