如何防止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 并捕获异常,那么整个搜索也将失败。
谢谢。请澄清您需要的任何东西。
编辑以更清晰。
递归扫描目录树时,例如使用递归方法,该方法将目录作为参数,您可以获取目录的属性。然后检查它是否是系统目录而不是像"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);
}
}