获取文件时System.UnauthorizedAccessException

时间:2013-12-17 08:10:21

标签: c# console-application .net

我在here之前问了一个非常相似的问题。但这是关于获取目录,这是关于文件。这些代码彼此有点不同。自从我一直试图将其转换为在我的旧问题上看起来像answer之后,我一直无法使其发挥作用。

string[] files = Directory.GetFiles(ScanPath, "*.*", System.IO.SearchOption.AllDirectories);
DateTime From = DateTime.Now.AddHours(-24);
DateTime To = DateTime.Now;

foreach (string name in files)
{
   FileInfo file = new FileInfo(name);
   string fullname = file.FullName;

   if (file.LastWriteTime >= From & file.LastWriteTime <= To && file.Length >= ScanSize)
      Console.WriteLine(file.FullName + " ; " + "last changed at  " + " ; " + file.LastWriteTime.ToString());
}

我得到了与我在另一个问题中解释的相同的错误。因为我不知道在递归中将foreach的代码放在何处。因为它不是枚举而是Directory.GetFiles()

错误发生在:

Directory.GetFiles(ScanPath, "*", SearchOption.AllDirectories);

因为这会立即获取目录的所有文件。但是如果我删除它,它只获取给定路径中的文件,而不包含子目录中的任何文件。所以我被告知应用递归。

我是系统的管理员,我打算在整个数据驱动器上运行它。 d:\

我希望这里有人知道一个很好的例子。

2 个答案:

答案 0 :(得分:2)

您的应用无法访问某些文件夹,对于其他人,您可以使用以下代码:

void DiscoverDirs(string where, List<string> files, Func<FileInfo, bool> filter)
{
    try
    {
        var di = new DirectoryInfo(where);
        files.AddRange(di.EnumerateFiles().Where(filter).Select(x => x.FullName));

        foreach (var dir in Directory.GetDirectories(where))
        {
            DiscoverDirs(dir, files, filter);
        }
    }
    catch
    {
        // no access fo this dir, ignore
    }
}

用法:

DateTime From = DateTime.Now.AddHours(-24);
DateTime To = DateTime.Now;
var ScanSize = 5*1024*1024;

var list = new List<string>();
DiscoverDirs(@"C:\", list, 
    file => file.LastWriteTime >= From & file.LastWriteTime <= To && file.Length >= ScanSize);

foreach (string name in list)
{
    FileInfo file = new FileInfo(name);
    string fullname = file.FullName;

    Console.WriteLine(file.FullName + " ; " + "last changed at  " + " ; " + file.LastWriteTime.ToString());
}

答案 1 :(得分:1)

访问某些系统目录时可能会出现“UnauthorizedAccessException”。导致问题的目录列表实际上只是重定向到其他目录的目录。 如果有帮助,可能是您可以试用以下代码 -

try
{
    foreach (String file in Directory.GetFiles(directoryName, pattern, SearchOption.TopDirectoryOnly))
    {
       // do stuff
    }
catch (UnauthorizedAccessException uae)
{
           //handle
}
catch (Exception e) 
{ 
           //handle
}

<强>替代:

string[] directories = Directory.GetDirectories(ScanPath);

    foreach (string directory in directories)
    {
        string[] filesinCurrentDirectory = Directory.GetFiles(directory, "*.*", System.IO.SearchOption.AllDirectories);
        foreach (string file in filesinCurrentDirectory)
        {
            MessageBox.Show(file);
        }

    }