Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取所有目录和捕获权限异常并继续_C# - Fatal编程技术网

C# 获取所有目录和捕获权限异常并继续

C# 获取所有目录和捕获权限异常并继续,c#,C#,我想从特定路径的每个目录中获取最新文件,并在捕获权限异常后继续,当前我的代码卡在catch中,无法继续 不幸的是,Microsoft的GetDirectory实现非常差,无法处理与访问权限相关的IO异常 public void newestFile(string path) { try { foreach (var item in dir.GetDirectories("*.*", SearchOption.AllDirectories)) {

我想从特定路径的每个目录中获取最新文件,并在捕获权限异常后继续,当前我的代码卡在catch中,无法继续

不幸的是,Microsoft的GetDirectory实现非常差,无法处理与访问权限相关的IO异常

public void newestFile(string path)
{
    try
    {
        foreach (var item in dir.GetDirectories("*.*", SearchOption.AllDirectories))
        {
            var file = item.GetFiles().OrderByDescending(f => f.LastWriteTime).First();
        } 
    }
    catch (Exception ex)
    {

    }                     
}
如果您只想跳过您无权访问的目录,例如特殊回收站文件夹,那么您必须为Windows API函数FindFirstFile和FindNextFile编写自己的包装器

这里有一个完整的例子。如果您运行它,您将看到它列出了C:驱动器上所有可访问的目录

public string[] newestFile(string path){    
    IEnumerable<string> files = new string[]{};
    foreach (var item in dir.GetDirectories(Path.Combine(path,"*.*"), SearchOption.AllDirectories))
    {
       try {
        files = files.Concat(item.GetFiles().OrderByDescending(f => f.LastWriteTime).First());
       }
       catch {}
    }   
    return files.ToArray();  
}
注意:这段代码使用FindFirstFile和FindNextFile,它们会遍历所有文件夹和文件。上面的代码只是忽略文件,只返回文件夹


使用并指定一个只返回目录的标志会更有效。我把这种变化作为众所周知的练习留给读者

不幸的是,Microsoft的GetDirectory实现非常差,无法处理与访问权限相关的IO异常

如果您只想跳过您无权访问的目录,例如特殊回收站文件夹,那么您必须为Windows API函数FindFirstFile和FindNextFile编写自己的包装器

这里有一个完整的例子。如果您运行它,您将看到它列出了C:驱动器上所有可访问的目录

public string[] newestFile(string path){    
    IEnumerable<string> files = new string[]{};
    foreach (var item in dir.GetDirectories(Path.Combine(path,"*.*"), SearchOption.AllDirectories))
    {
       try {
        files = files.Concat(item.GetFiles().OrderByDescending(f => f.LastWriteTime).First());
       }
       catch {}
    }   
    return files.ToArray();  
}
注意:这段代码使用FindFirstFile和FindNextFile,它们会遍历所有文件夹和文件。上面的代码只是忽略文件,只返回文件夹


使用并指定一个只返回目录的标志会更有效。我把这种变化作为众所周知的练习留给读者

吹毛求疵:您应该只捕获忽略您想要忽略的特定异常,例如,您的案例中的UnauthorizedAccessException。否则,您可能也会意外地吞下其他异常,从而产生难以找到的bug。只搜索顶级目录并执行自己的递归循环不确定为什么要搜索带有错误的目录。在它们中也有,但那只是更多的吹毛求疵,我认为你有一个合理的吹毛求疵:你应该只捕获忽略你想忽略的特定异常,例如,在你的情况下,一个未经授权的访问异常。否则,您可能也会意外地吞下其他异常,从而产生难以找到的bug。只搜索顶级目录并执行自己的递归循环不确定为什么要搜索带有错误的目录。在它们中也有,但那只是更多的吹毛求疵,我想你有一个理由,我需要在这个类中更改什么,以便只接收具有权限的目录?@user2214609它已经只给你有权限读取的目录。这条线如果!findHandle.IsInvalid正在防止无效的目录。那么为什么它会从C返回所有包含回收站的目录呢?我打开这篇文章是因为我的函数因访问被拒绝而崩溃。您介意解释一下行[SecurityPermissionSecurityAction.LinkDemand,UnmanagedCode=true]吗如何用SecurityCriticalAttribute替换LinkDemand?为了只接收具有权限的目录,我需要在这个类中做什么更改?@user2214609它已经只给了您有权限读取的目录。这条线如果!findHandle.IsInvalid正在防止无效的目录。那么为什么它会从C返回所有包含回收站的目录呢?我打开这篇文章是因为我的函数因访问被拒绝而崩溃。您介意解释一下行[SecurityPermissionSecurityAction.LinkDemand,UnmanagedCode=true]吗如何用SecurityCriticalAttribute替换LinkDemand?