C# C-检查是否可以访问/读取文件夹 在结束我的问题之前,请查看我在问题末尾检查了哪些内容不起作用 问题
我一直在尝试各种各样的答案,所有的答案都给我带来了一个例外,除此之外,很多答案听起来过于复杂,因为它们应该非常简单 在执行之前,如何检查我是否有权限枚举文件夹的内容?我不希望使用try/catch,因为我正在遍历文件系统,多个try/catch会影响C上的性能 每当我尝试以下方法时:C# C-检查是否可以访问/读取文件夹 在结束我的问题之前,请查看我在问题末尾检查了哪些内容不起作用 问题,c#,permissions,filesystemobject,directoryinfo,system.io.directory,C#,Permissions,Filesystemobject,Directoryinfo,System.io.directory,我一直在尝试各种各样的答案,所有的答案都给我带来了一个例外,除此之外,很多答案听起来过于复杂,因为它们应该非常简单 在执行之前,如何检查我是否有权限枚举文件夹的内容?我不希望使用try/catch,因为我正在遍历文件系统,多个try/catch会影响C上的性能 每当我尝试以下方法时: //where dir is a DirectoryInfo instance foreach (FileInfo file in dir.EnumerateFiles()) 我得到一个例外: Directory
//where dir is a DirectoryInfo instance
foreach (FileInfo file in dir.EnumerateFiles())
我得到一个例外:
DirectorySecurity security = dir.GetAccessControl(AccessControlSections.All);
mscorlib.dll中发生类型为“System.UnauthorizedAccessException”的未处理异常
其他信息:O acesso ao caminho'e:\$RECYCLE.BIN\S-1-5-18'foi negado。
翻译:对路径“e:\$RECYCLE.BIN\S-1-5-18”的访问被拒绝
什么不起作用:
1:
当我这样做时,代码进入if并在命中枚举时抛出相同的异常
PermissionSet permissions = new PermissionSet(System.Security.Permissions.PermissionState.None);
permissions.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read, dir.FullName));
if (permissions.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet))
2:
以下情况引发了一个例外:
DirectorySecurity security = dir.GetAccessControl(AccessControlSections.All);
例外情况:
mscorlib.dll中发生类型为“System.Security.AccessControl.PrivilegeneThedException”的未处理异常
其他信息:O Privilleégio’SeSecurityPrivilege’necessário para esta operaèO进程。
转换:进程没有此操作所需的“SeSecurityPrivilege”权限
以及:
DirectorySecurity security = dir.GetAccessControl(AccessControlSections.None);
例外情况:
mscorlib.dll中发生类型为“System.UnauthorizedAccessException”的未处理异常
其他信息:乌马歌剧院行政管理局(Tentiva de Executuço de uma operaçonão autorizada)。
翻译:试图执行未经授权的操作
三:
尝试:
DirectorySecurity security = Directory.GetAccessControl(dir.FullName);
与上述相同的例外情况
在执行之前,如何检查我是否有权限枚举文件夹的内容
你不能。或者至少不够可靠,无法解决问题。磁盘访问是一件你可以再试一次的事情。仅仅因为它工作过一次,并不意味着它将继续工作。我的意思是,如果有人在这次读取和上次读取之间取出磁盘,你会怎么做?或者文件夹权限是否已更改?有太多超出你控制范围的事情是你必须期待的
磁盘错误属于的类别。而那些你只能处理的,永远不能避免的
关于正确的异常处理,我有两篇文章。我已经链接的第一个。第二个是:
在执行之前,如何检查我是否有权限枚举文件夹的内容
你不能。或者至少不够可靠,无法解决问题。磁盘访问是一件你可以再试一次的事情。仅仅因为它工作过一次,并不意味着它将继续工作。我的意思是,如果有人在这次读取和上次读取之间取出磁盘,你会怎么做?或者文件夹权限是否已更改?有太多超出你控制范围的事情是你必须期待的
磁盘错误属于的类别。而那些你只能处理的,永远不能避免的
关于正确的异常处理,我有两篇文章。我已经链接的第一个。第二个问题是:这似乎是一个很好的问题,可以发布我的SafeWalk课程,它收集了来自多个答案的提示。它能够在我的盒子上遍历C:\和D:\而不会引起问题
public static class SafeWalk {
[Flags]
public enum ReturnOptions {
ReturnFiles = 1, ReturnDirectories = 2, ReturnBoth = 3
}
const string AllFiles = "*.*";
// File and Directory Name Tree Walkers
public static IEnumerable<string> SafeEnumerateFileAndDirNames(this DirectoryInfo di, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
di.FullName.SafeEnumerateFileAndDirNames(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnBoth);
public static IEnumerable<string> SafeEnumerateFileAndDirNames(this DirectoryInfo di, string filePattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
di.FullName.SafeEnumerateFileAndDirNames(filePattern, AllFiles, searchOpt, ReturnOptions.ReturnBoth);
public static IEnumerable<string> SafeEnumerateFileAndDirNames(this DirectoryInfo di, string filePattern, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
di.FullName.SafeEnumerateFileAndDirNames(filePattern, dirPattern, searchOpt, ReturnOptions.ReturnBoth);
public static IEnumerable<string> SafeEnumerateFileAndDirNames(this string path, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.SafeEnumerateFileAndDirNames(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnBoth);
public static IEnumerable<string> SafeEnumerateFileAndDirNames(this string path, string filePattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.SafeEnumerateFileAndDirNames(filePattern, AllFiles, searchOpt, ReturnOptions.ReturnBoth);
public static IEnumerable<string> SafeEnumerateFileAndDirNames(this string path, string filePattern, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly, ReturnOptions returnOpt = ReturnOptions.ReturnBoth) {
var searchQueue = new Queue<string>() { path };
while (searchQueue.Count > 0) {
var cdn = searchQueue.Dequeue();
IEnumerable<string> cdiFiles = null;
if (returnOpt.HasFlag(ReturnOptions.ReturnFiles)) {
try {
cdiFiles = Directory.EnumerateFiles(cdn, filePattern, SearchOption.TopDirectoryOnly);
}
catch (Exception) {
}
if (cdiFiles != null)
foreach (var filename in cdiFiles)
yield return filename;
}
if ((!returnOpt.HasFlag(ReturnOptions.ReturnFiles) || cdiFiles != null) && (returnOpt.HasFlag(ReturnOptions.ReturnDirectories) || searchOpt == SearchOption.AllDirectories)) { // skip if file enumeration failed
IEnumerable<string> cdiDirs = null;
try {
cdiDirs = Directory.EnumerateDirectories(cdn, dirPattern, SearchOption.TopDirectoryOnly);
}
catch (Exception) {
}
if (cdiDirs != null) {
foreach (var dirname in cdiDirs) {
if (searchOpt == SearchOption.AllDirectories)
searchQueue.Enqueue(dirname);
if (returnOpt.HasFlag(ReturnOptions.ReturnDirectories))
yield return dirname;
}
}
}
}
}
public static IEnumerable<string> SafeEnumerateFileNames(this string path, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.SafeEnumerateFileAndDirNames(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnFiles);
public static IEnumerable<string> SafeEnumerateFileNames(this string path, string filePattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.SafeEnumerateFileAndDirNames(filePattern, AllFiles, searchOpt, ReturnOptions.ReturnFiles);
public static IEnumerable<string> SafeEnumerateFileNames(this string path, string filePattern, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.SafeEnumerateFileAndDirNames(filePattern, dirPattern, searchOpt, ReturnOptions.ReturnFiles);
public static IEnumerable<string> SafeEnumerateFileNames(this DirectoryInfo path, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.FullName.SafeEnumerateFileAndDirNames(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnFiles);
public static IEnumerable<string> SafeEnumerateFileNames(this DirectoryInfo path, string filePattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.FullName.SafeEnumerateFileAndDirNames(filePattern, AllFiles, searchOpt, ReturnOptions.ReturnFiles);
public static IEnumerable<string> SafeEnumerateFileNames(this DirectoryInfo path, string filePattern, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.FullName.SafeEnumerateFileAndDirNames(filePattern, dirPattern, searchOpt, ReturnOptions.ReturnFiles);
public static IEnumerable<string> SafeEnumerateDirectoryNames(this string path, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.SafeEnumerateFileAndDirNames(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnDirectories);
public static IEnumerable<string> SafeEnumerateDirectoryNames(this string path, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.SafeEnumerateFileAndDirNames(AllFiles, dirPattern, searchOpt, ReturnOptions.ReturnDirectories);
public static IEnumerable<string> SafeEnumerateDirectoryNames(this DirectoryInfo path, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.FullName.SafeEnumerateFileAndDirNames(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnDirectories);
public static IEnumerable<string> SafeEnumerateDirectoryNames(this DirectoryInfo path, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.FullName.SafeEnumerateFileAndDirNames(AllFiles, dirPattern, searchOpt, ReturnOptions.ReturnDirectories);
// File and Directory Info Tree Walkers
public static IEnumerable<FileSystemInfo> SafeEnumerateFileSystemInfos(this string path, SearchOption searchOpt = SearchOption.TopDirectoryOnly, ReturnOptions returnOpt = ReturnOptions.ReturnBoth) =>
new DirectoryInfo(path).SafeEnumerateFileSystemInfos(AllFiles, AllFiles, searchOpt, returnOpt);
public static IEnumerable<FileSystemInfo> SafeEnumerateFileSystemInfos(this string path, string searchPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly, ReturnOptions returnOpt = ReturnOptions.ReturnBoth) =>
new DirectoryInfo(path).SafeEnumerateFileSystemInfos(searchPattern, searchPattern, searchOpt, returnOpt);
public static IEnumerable<FileSystemInfo> SafeEnumerateFileSystemInfos(this string path, string filePattern, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly, ReturnOptions returnOpt = ReturnOptions.ReturnBoth) =>
new DirectoryInfo(path).SafeEnumerateFileSystemInfos(filePattern, dirPattern, searchOpt, returnOpt);
public static IEnumerable<FileSystemInfo> SafeEnumerateFileSystemInfos(this DirectoryInfo di, SearchOption searchOpt = SearchOption.TopDirectoryOnly, ReturnOptions returnOpt = ReturnOptions.ReturnBoth) =>
di.SafeEnumerateFileSystemInfos(AllFiles, AllFiles, searchOpt, returnOpt);
public static IEnumerable<FileSystemInfo> SafeEnumerateFileSystemInfos(this DirectoryInfo di, string searchPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly, ReturnOptions returnOpt = ReturnOptions.ReturnBoth) =>
di.SafeEnumerateFileSystemInfos(searchPattern, searchPattern, searchOpt, returnOpt);
public static IEnumerable<FileSystemInfo> SafeEnumerateFileSystemInfos(this DirectoryInfo di, string filePattern, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly, ReturnOptions returnOpt = ReturnOptions.ReturnBoth) {
var searchQueue = new Queue<DirectoryInfo>();
searchQueue.Enqueue(di);
while (searchQueue.Count > 0) {
var cdi = searchQueue.Dequeue();
IEnumerable<string> cdiFiles = null;
if (returnOpt.HasFlag(ReturnOptions.ReturnFiles)) {
try {
cdiFiles = Directory.EnumerateFiles(cdi.FullName, filePattern, SearchOption.TopDirectoryOnly);
}
catch (Exception) {
}
if (cdiFiles != null) {
var cfis = new ConcurrentBag<FileInfo>();
cdiFiles.AsParallel()
.ForAll(f => {
try {
cfis.Add(new FileInfo(f));
}
catch (Exception) {
}
});
foreach (var fi in cfis)
yield return fi;
}
}
if ((!returnOpt.HasFlag(ReturnOptions.ReturnFiles) || cdiFiles != null) && (returnOpt.HasFlag(ReturnOptions.ReturnDirectories) || searchOpt.HasFlag(SearchOption.AllDirectories))) { // skip if file enumeration failed
IEnumerable<string> cdiDirs = null;
try {
cdiDirs = Directory.EnumerateDirectories(cdi.FullName, dirPattern, SearchOption.TopDirectoryOnly);
}
catch (Exception) {
}
if (cdiDirs != null) {
var cdis = new ConcurrentBag<DirectoryInfo>();
cdiDirs.AsParallel()
.ForAll(d => {
try {
cdis.Add(new DirectoryInfo(d));
}
catch (Exception) {
}
});
foreach (var rdi in cdis) {
if (returnOpt.HasFlag(ReturnOptions.ReturnDirectories))
yield return rdi;
if (searchOpt == SearchOption.AllDirectories)
searchQueue.Enqueue(rdi);
}
}
}
}
}
public static IEnumerable<FileInfo> SafeEnumerateFileInfos(this string path, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
new DirectoryInfo(path).SafeEnumerateFileSystemInfos(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnFiles).Cast<FileInfo>();
public static IEnumerable<FileInfo> SafeEnumerateFileInfos(this string path, string filePattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
new DirectoryInfo(path).SafeEnumerateFileSystemInfos(filePattern, AllFiles, searchOpt, ReturnOptions.ReturnFiles).Cast<FileInfo>();
public static IEnumerable<FileInfo> SafeEnumerateFileInfos(this string path, string filePattern, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
new DirectoryInfo(path).SafeEnumerateFileSystemInfos(filePattern, dirPattern, searchOpt, ReturnOptions.ReturnFiles).Cast<FileInfo>();
public static IEnumerable<FileInfo> SafeEnumerateFileInfos(this DirectoryInfo di, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
di.SafeEnumerateFileSystemInfos(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnFiles).Cast<FileInfo>();
public static IEnumerable<FileInfo> SafeEnumerateFileInfos(this DirectoryInfo di, string filePattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
di.SafeEnumerateFileSystemInfos(filePattern, AllFiles, searchOpt, ReturnOptions.ReturnFiles).Cast<FileInfo>();
public static IEnumerable<FileInfo> SafeEnumerateFileInfos(this DirectoryInfo di, string filePattern, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
di.SafeEnumerateFileSystemInfos(filePattern, dirPattern, searchOpt, ReturnOptions.ReturnFiles).Cast<FileInfo>();
public static IEnumerable<DirectoryInfo> SafeEnumerateDirectoryInfos(this string path, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
new DirectoryInfo(path).SafeEnumerateFileSystemInfos(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnDirectories).Cast<DirectoryInfo>();
public static IEnumerable<DirectoryInfo> SafeEnumerateDirectoryInfos(this string path, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
new DirectoryInfo(path).SafeEnumerateFileSystemInfos(AllFiles, dirPattern, searchOpt, ReturnOptions.ReturnDirectories).Cast<DirectoryInfo>();
public static IEnumerable<DirectoryInfo> SafeEnumerateDirectoryInfos(this DirectoryInfo di, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
di.SafeEnumerateFileSystemInfos(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnDirectories).Cast<DirectoryInfo>();
public static IEnumerable<DirectoryInfo> SafeEnumerateDirectoryInfos(this DirectoryInfo di, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
di.SafeEnumerateFileSystemInfos(AllFiles, dirPattern, searchOpt, ReturnOptions.ReturnDirectories).Cast<DirectoryInfo>();
}
这似乎是一个很好的问题来发布我的安全行走课程,它收集了来自多个答案的提示。它能够在我的盒子上遍历C:\和D:\而不会引起问题
public static class SafeWalk {
[Flags]
public enum ReturnOptions {
ReturnFiles = 1, ReturnDirectories = 2, ReturnBoth = 3
}
const string AllFiles = "*.*";
// File and Directory Name Tree Walkers
public static IEnumerable<string> SafeEnumerateFileAndDirNames(this DirectoryInfo di, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
di.FullName.SafeEnumerateFileAndDirNames(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnBoth);
public static IEnumerable<string> SafeEnumerateFileAndDirNames(this DirectoryInfo di, string filePattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
di.FullName.SafeEnumerateFileAndDirNames(filePattern, AllFiles, searchOpt, ReturnOptions.ReturnBoth);
public static IEnumerable<string> SafeEnumerateFileAndDirNames(this DirectoryInfo di, string filePattern, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
di.FullName.SafeEnumerateFileAndDirNames(filePattern, dirPattern, searchOpt, ReturnOptions.ReturnBoth);
public static IEnumerable<string> SafeEnumerateFileAndDirNames(this string path, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.SafeEnumerateFileAndDirNames(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnBoth);
public static IEnumerable<string> SafeEnumerateFileAndDirNames(this string path, string filePattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.SafeEnumerateFileAndDirNames(filePattern, AllFiles, searchOpt, ReturnOptions.ReturnBoth);
public static IEnumerable<string> SafeEnumerateFileAndDirNames(this string path, string filePattern, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly, ReturnOptions returnOpt = ReturnOptions.ReturnBoth) {
var searchQueue = new Queue<string>() { path };
while (searchQueue.Count > 0) {
var cdn = searchQueue.Dequeue();
IEnumerable<string> cdiFiles = null;
if (returnOpt.HasFlag(ReturnOptions.ReturnFiles)) {
try {
cdiFiles = Directory.EnumerateFiles(cdn, filePattern, SearchOption.TopDirectoryOnly);
}
catch (Exception) {
}
if (cdiFiles != null)
foreach (var filename in cdiFiles)
yield return filename;
}
if ((!returnOpt.HasFlag(ReturnOptions.ReturnFiles) || cdiFiles != null) && (returnOpt.HasFlag(ReturnOptions.ReturnDirectories) || searchOpt == SearchOption.AllDirectories)) { // skip if file enumeration failed
IEnumerable<string> cdiDirs = null;
try {
cdiDirs = Directory.EnumerateDirectories(cdn, dirPattern, SearchOption.TopDirectoryOnly);
}
catch (Exception) {
}
if (cdiDirs != null) {
foreach (var dirname in cdiDirs) {
if (searchOpt == SearchOption.AllDirectories)
searchQueue.Enqueue(dirname);
if (returnOpt.HasFlag(ReturnOptions.ReturnDirectories))
yield return dirname;
}
}
}
}
}
public static IEnumerable<string> SafeEnumerateFileNames(this string path, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.SafeEnumerateFileAndDirNames(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnFiles);
public static IEnumerable<string> SafeEnumerateFileNames(this string path, string filePattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.SafeEnumerateFileAndDirNames(filePattern, AllFiles, searchOpt, ReturnOptions.ReturnFiles);
public static IEnumerable<string> SafeEnumerateFileNames(this string path, string filePattern, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.SafeEnumerateFileAndDirNames(filePattern, dirPattern, searchOpt, ReturnOptions.ReturnFiles);
public static IEnumerable<string> SafeEnumerateFileNames(this DirectoryInfo path, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.FullName.SafeEnumerateFileAndDirNames(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnFiles);
public static IEnumerable<string> SafeEnumerateFileNames(this DirectoryInfo path, string filePattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.FullName.SafeEnumerateFileAndDirNames(filePattern, AllFiles, searchOpt, ReturnOptions.ReturnFiles);
public static IEnumerable<string> SafeEnumerateFileNames(this DirectoryInfo path, string filePattern, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.FullName.SafeEnumerateFileAndDirNames(filePattern, dirPattern, searchOpt, ReturnOptions.ReturnFiles);
public static IEnumerable<string> SafeEnumerateDirectoryNames(this string path, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.SafeEnumerateFileAndDirNames(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnDirectories);
public static IEnumerable<string> SafeEnumerateDirectoryNames(this string path, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.SafeEnumerateFileAndDirNames(AllFiles, dirPattern, searchOpt, ReturnOptions.ReturnDirectories);
public static IEnumerable<string> SafeEnumerateDirectoryNames(this DirectoryInfo path, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.FullName.SafeEnumerateFileAndDirNames(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnDirectories);
public static IEnumerable<string> SafeEnumerateDirectoryNames(this DirectoryInfo path, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
path.FullName.SafeEnumerateFileAndDirNames(AllFiles, dirPattern, searchOpt, ReturnOptions.ReturnDirectories);
// File and Directory Info Tree Walkers
public static IEnumerable<FileSystemInfo> SafeEnumerateFileSystemInfos(this string path, SearchOption searchOpt = SearchOption.TopDirectoryOnly, ReturnOptions returnOpt = ReturnOptions.ReturnBoth) =>
new DirectoryInfo(path).SafeEnumerateFileSystemInfos(AllFiles, AllFiles, searchOpt, returnOpt);
public static IEnumerable<FileSystemInfo> SafeEnumerateFileSystemInfos(this string path, string searchPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly, ReturnOptions returnOpt = ReturnOptions.ReturnBoth) =>
new DirectoryInfo(path).SafeEnumerateFileSystemInfos(searchPattern, searchPattern, searchOpt, returnOpt);
public static IEnumerable<FileSystemInfo> SafeEnumerateFileSystemInfos(this string path, string filePattern, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly, ReturnOptions returnOpt = ReturnOptions.ReturnBoth) =>
new DirectoryInfo(path).SafeEnumerateFileSystemInfos(filePattern, dirPattern, searchOpt, returnOpt);
public static IEnumerable<FileSystemInfo> SafeEnumerateFileSystemInfos(this DirectoryInfo di, SearchOption searchOpt = SearchOption.TopDirectoryOnly, ReturnOptions returnOpt = ReturnOptions.ReturnBoth) =>
di.SafeEnumerateFileSystemInfos(AllFiles, AllFiles, searchOpt, returnOpt);
public static IEnumerable<FileSystemInfo> SafeEnumerateFileSystemInfos(this DirectoryInfo di, string searchPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly, ReturnOptions returnOpt = ReturnOptions.ReturnBoth) =>
di.SafeEnumerateFileSystemInfos(searchPattern, searchPattern, searchOpt, returnOpt);
public static IEnumerable<FileSystemInfo> SafeEnumerateFileSystemInfos(this DirectoryInfo di, string filePattern, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly, ReturnOptions returnOpt = ReturnOptions.ReturnBoth) {
var searchQueue = new Queue<DirectoryInfo>();
searchQueue.Enqueue(di);
while (searchQueue.Count > 0) {
var cdi = searchQueue.Dequeue();
IEnumerable<string> cdiFiles = null;
if (returnOpt.HasFlag(ReturnOptions.ReturnFiles)) {
try {
cdiFiles = Directory.EnumerateFiles(cdi.FullName, filePattern, SearchOption.TopDirectoryOnly);
}
catch (Exception) {
}
if (cdiFiles != null) {
var cfis = new ConcurrentBag<FileInfo>();
cdiFiles.AsParallel()
.ForAll(f => {
try {
cfis.Add(new FileInfo(f));
}
catch (Exception) {
}
});
foreach (var fi in cfis)
yield return fi;
}
}
if ((!returnOpt.HasFlag(ReturnOptions.ReturnFiles) || cdiFiles != null) && (returnOpt.HasFlag(ReturnOptions.ReturnDirectories) || searchOpt.HasFlag(SearchOption.AllDirectories))) { // skip if file enumeration failed
IEnumerable<string> cdiDirs = null;
try {
cdiDirs = Directory.EnumerateDirectories(cdi.FullName, dirPattern, SearchOption.TopDirectoryOnly);
}
catch (Exception) {
}
if (cdiDirs != null) {
var cdis = new ConcurrentBag<DirectoryInfo>();
cdiDirs.AsParallel()
.ForAll(d => {
try {
cdis.Add(new DirectoryInfo(d));
}
catch (Exception) {
}
});
foreach (var rdi in cdis) {
if (returnOpt.HasFlag(ReturnOptions.ReturnDirectories))
yield return rdi;
if (searchOpt == SearchOption.AllDirectories)
searchQueue.Enqueue(rdi);
}
}
}
}
}
public static IEnumerable<FileInfo> SafeEnumerateFileInfos(this string path, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
new DirectoryInfo(path).SafeEnumerateFileSystemInfos(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnFiles).Cast<FileInfo>();
public static IEnumerable<FileInfo> SafeEnumerateFileInfos(this string path, string filePattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
new DirectoryInfo(path).SafeEnumerateFileSystemInfos(filePattern, AllFiles, searchOpt, ReturnOptions.ReturnFiles).Cast<FileInfo>();
public static IEnumerable<FileInfo> SafeEnumerateFileInfos(this string path, string filePattern, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
new DirectoryInfo(path).SafeEnumerateFileSystemInfos(filePattern, dirPattern, searchOpt, ReturnOptions.ReturnFiles).Cast<FileInfo>();
public static IEnumerable<FileInfo> SafeEnumerateFileInfos(this DirectoryInfo di, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
di.SafeEnumerateFileSystemInfos(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnFiles).Cast<FileInfo>();
public static IEnumerable<FileInfo> SafeEnumerateFileInfos(this DirectoryInfo di, string filePattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
di.SafeEnumerateFileSystemInfos(filePattern, AllFiles, searchOpt, ReturnOptions.ReturnFiles).Cast<FileInfo>();
public static IEnumerable<FileInfo> SafeEnumerateFileInfos(this DirectoryInfo di, string filePattern, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
di.SafeEnumerateFileSystemInfos(filePattern, dirPattern, searchOpt, ReturnOptions.ReturnFiles).Cast<FileInfo>();
public static IEnumerable<DirectoryInfo> SafeEnumerateDirectoryInfos(this string path, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
new DirectoryInfo(path).SafeEnumerateFileSystemInfos(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnDirectories).Cast<DirectoryInfo>();
public static IEnumerable<DirectoryInfo> SafeEnumerateDirectoryInfos(this string path, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
new DirectoryInfo(path).SafeEnumerateFileSystemInfos(AllFiles, dirPattern, searchOpt, ReturnOptions.ReturnDirectories).Cast<DirectoryInfo>();
public static IEnumerable<DirectoryInfo> SafeEnumerateDirectoryInfos(this DirectoryInfo di, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
di.SafeEnumerateFileSystemInfos(AllFiles, AllFiles, searchOpt, ReturnOptions.ReturnDirectories).Cast<DirectoryInfo>();
public static IEnumerable<DirectoryInfo> SafeEnumerateDirectoryInfos(this DirectoryInfo di, string dirPattern, SearchOption searchOpt = SearchOption.TopDirectoryOnly) =>
di.SafeEnumerateFileSystemInfos(AllFiles, dirPattern, searchOpt, ReturnOptions.ReturnDirectories).Cast<DirectoryInfo>();
}
不是我的反对票,但你提到的那些事件是如此罕见,我认为在我的情况下不值得关注它们。如果用户拉磁盘,那么,很抱歉,用户。@DanielMöller我实际上只是处理了一个Windows,其中磁盘驱动程序在启动5分钟后似乎出现故障。而windows并没有优雅地处理它。这有点像锁起来了。不是我的反对票,但你提到的那些事件是如此罕见,我认为在我的情况下不值得关心它们。如果用户拉磁盘,那么,很抱歉,用户。@DanielMöller我实际上只是处理了一个Windows,其中磁盘驱动程序在启动5分钟后似乎出现故障。而windows并没有优雅地处理它。如果你只想跳过系统文件夹,那么你可以使用DirectoryInfo并检查它的属性属性。我尝试了这个方法,它似乎可以工作,但后来一个只有属性目录的目录出现了同样的问题。双重检查行吗?首先检查系统,然后用其中一个答案检查权限?可能是手动更改权限?我会跳过所有带有系统和隐藏属性的内容。然而,在任何情况下都需要尝试/捕获。至少您可以限制在枚举文件夹时引发的异常。@但是,在任何情况下都需要尝试/捕获。你把foreach写的方式放在哪里?如果要执行此操作,您已经尝试访问该文件,此处没有帮助。一个选项是过滤t
如果你只想跳过系统文件夹,那么你可以使用DirectoryInfo并检查它的属性。我尝试了这个方法,它似乎可以工作,但后来一个只有属性目录的目录出现了同样的问题。双重检查行吗?首先检查系统,然后用其中一个答案检查权限?可能是手动更改权限?我会跳过所有带有系统和隐藏属性的内容。然而,在任何情况下都需要尝试/捕获。至少您可以限制在枚举文件夹时引发的异常。@但是,在任何情况下都需要尝试/捕获。你把foreach写的方式放在哪里?如果要执行此操作,您已经尝试访问该文件,此处没有帮助。一个选项是用where。。。