当 Directory.GetFiles() 被拒绝访问时忽略文件夹/文件
我试图显示在所选目录(以及可选的任何子目录)中找到的所有文件的列表。 我遇到的问题是,当 GetFiles() 方法遇到它无法访问的文件夹时,它会引发异常并且进程停止。
如何忽略此异常(并忽略受保护的文件夹/文件)并继续将可访问的文件添加到列表中?
try
{
if (cbSubFolders.Checked == false)
{
string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);
foreach (string fileName in files)
ProcessFile(fileName);
}
else
{
string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.*", SearchOption.AllDirectories);
foreach (string fileName in files)
ProcessFile(fileName);
}
lblNumberOfFilesDisplay.Enabled = true;
}
catch (UnauthorizedAccessException) { }
finally {}
I am trying to display a list of all files found in the selected directory (and optionally any subdirectories). The problem I am having is that when the GetFiles() method comes across a folder that it cannot access, it throws an exception and the process stops.
How do I ignore this exception (and ignore the protected folder/file) and continue adding accessible files to the list?
try
{
if (cbSubFolders.Checked == false)
{
string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);
foreach (string fileName in files)
ProcessFile(fileName);
}
else
{
string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath, "*.*", SearchOption.AllDirectories);
foreach (string fileName in files)
ProcessFile(fileName);
}
lblNumberOfFilesDisplay.Enabled = true;
}
catch (UnauthorizedAccessException) { }
finally {}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
您必须手动进行递归; 不要使用 AllDirectories - 一次查看一个文件夹,然后尝试从子目录获取文件。 未经测试,但如下所示(注意使用委托而不是构建数组):
You will have to do the recursion manually; don't use AllDirectories - look one folder at a time, then try getting the files from sub-dirs. Untested, but something like below (note uses a delegate rather than building an array):
从 .NET Standard 2.1(.NET Core 3+、.NET 5+)开始,您现在可以执行以下操作:
根据 MSDN 文档 关于 IgnoreInaccessible:
默认值实际上是 true,但我将其保留在这里只是为了显示该属性。
相同的重载也可用于
DirectoryInfo
。Since .NET Standard 2.1 (.NET Core 3+, .NET 5+), you can now just do:
According to the MSDN docs about IgnoreInaccessible:
Default value is actually true, but I've kept it here just to show the property.
The same overload is available for
DirectoryInfo
as well.这个简单的函数效果很好,满足了题目的要求。
This simple function works well and meets the questions requirements.
执行此操作的一个简单方法是使用文件列表和目录队列。
它节省内存。
如果您使用递归程序来执行相同的任务,则可能会引发 OutOfMemory 异常。
输出:列表中添加的文件按照从上到下(广度优先)目录树进行组织。
步骤:
A simple way to do this is by using a List for files and a Queue for directories.
It conserves memory.
If you use a recursive program to do the same task, that could throw OutOfMemory exception.
The output: files added in the List, are organised according to the top to bottom (breadth first) directory tree.
Steps:
有关处理 UnauthorizedAccessException 问题的解决方案,请参阅 https://stackoverflow.com/a/10728792/89584。
如果对具有混合权限的文件夹调用 GetFiles() 或 GetDirectories(),则上述所有解决方案都将丢失文件和/或目录。
see https://stackoverflow.com/a/10728792/89584 for a solution that handles the UnauthorisedAccessException problem.
All the solutions above will miss files and/or directories if any calls to GetFiles() or GetDirectories() are on folders with a mix of permissions.
这是一个功能齐全、与 .NET 2.0 兼容的实现。
您甚至可以更改生成的文件列表以跳过 FileSystemInfo 版本中的目录!
(注意
null
值!)Here's a full-featured, .NET 2.0-compatible implementation.
You can even alter the yielded
List
of files to skip over directories in theFileSystemInfo
version!(Beware
null
values!)这应该回答这个问题。 我忽略了浏览子目录的问题,我假设您已经弄清楚了。
当然,您不需要为此使用单独的方法,但您可能会发现它是一个有用的地方,可以验证路径是否有效,并处理调用 GetFiles() 时可能遇到的其他异常。
希望这可以帮助。
This should answer the question. I've ignored the issue of going through subdirectories, I'm assuming you have that figured out.
Of course, you don't need to have a seperate method for this, but you might find it a useful place to also verify the path is valid, and deal with the other exceptions that you could encounter when calling GetFiles().
Hope this helps.
我更喜欢使用c#框架函数,但是我需要的函数将包含在.net框架5.0中,所以我必须编写它。
I prefer using c# framework functions, but the function i need will be included in .net framework 5.0, so i have to write it.
对于那些目标框架低于 NET 2.1 的人,只需在 nuget 上获取 Microsoft.IO.Redist 即可。
For those who target framework is bellow NET 2.1 just get Microsoft.IO.Redist on nuget.