如何防止Directory.GetFiles“检查”回收站和其他“不安全”的地方

本文关键字:不安全 何防止 其他 Directory 检查 回收站 GetFiles | 更新日期: 2023-09-27 18:30:52

伙计们,我的应用程序中有一个函数,可以使用GetFiles方法搜索特定目录中的某些文件

System.IO.Directory.GetFiles(string path, string searchPattern, System.IO.SearchOption)

它工作正常,直到我选择要搜索的驱动器目录(D:'C:'等),因为它也访问回收站,然后受到限制

访问路径 'D:''$RECYCLE。BIN''S-1-5-21-106145493-3722843178-2978326776-1010' 被拒绝。

它还需要能够搜索子文件夹(SearchOption.AllDirectories)。

如何跳过要搜索的地方?因为可能有任何其他文件夹的访问也被拒绝。

我将 SKIP 大写,因为如果我使用 try catch 并捕获异常,那么整个搜索也将失败。

谢谢。请澄清您需要的任何东西。

如何防止Directory.GetFiles“检查”回收站和其他“不安全”的地方

编辑以更清晰。

递归

扫描目录树时,例如使用递归方法,该方法将目录作为参数,您可以获取目录的属性。然后检查它是否是系统目录而不是像"C:''"这样的根目录 - 在这种情况下,您想跳过该目录,因为它可能是回收站。

这里有一些代码可以做到这一点,并且还捕获了一些常见的异常,这些异常发生在我摆弄目录扫描时。

void    scan_dir(string path)
{
    // Exclude some directories according to their attributes
    string[] files = null;
    string skipReason = null;
    var dirInfo = new DirectoryInfo( path );
    var isroot = dirInfo.Root.FullName.Equals( dirInfo.FullName );
    if (    // as root dirs (e.g. "C:'") apparently have the system + hidden flags set, we must check whether it's a root dir, if it is, we do NOT skip it even though those attributes are present
            (dirInfo.Attributes.HasFlag( FileAttributes.System ) && !isroot)    // We must not access such folders/files, or this crashes with UnauthorizedAccessException on folders like $RECYCLE.BIN
        )
    {   skipReason = "system file/folder, no access";
    }
    if ( null == skipReason )
    {   try
        {   files = Directory.GetFiles( path );
        }
        catch (UnauthorizedAccessException ex)
        {   skipReason = ex.Message;
        }
        catch (PathTooLongException ex)
        {   skipReason = ex.Message;
        }
    }
    if (null != skipReason)
    {   // perhaps do some error logging, stating skipReason
        return; // we skip this directory
    }
    foreach (var f in files)
    {   var fileAttribs = new FileInfo( f ).Attributes;
        // do stuff with file if the attributes are to your liking
    }
    try
    {   var dirs = Directory.GetDirectories( path );
        foreach (var d in dirs)
        {   scan_dir( d ); // recursive call
        }
    }
    catch (PathTooLongException ex)
    {   Trace.WriteLine(ex.Message);
    }
}