Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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#_Console Application - Fatal编程技术网

在C#-控制台应用程序中拒绝访问目录

在C#-控制台应用程序中拒绝访问目录,c#,console-application,C#,Console Application,我试图访问文档目录和子目录,但每次它都说访问被拒绝。我看到一个例外: System.UnauthorizedAccessException:对路径“C:\Users\MyUser\Documents\My Music”的访问被拒绝 这是我的代码-我所要做的就是得到这个目录的总大小 class Program { static void Main(string[] args) { try { // Make a referen

我试图访问文档目录和子目录,但每次它都说访问被拒绝。我看到一个例外:

System.UnauthorizedAccessException:对路径“C:\Users\MyUser\Documents\My Music”的访问被拒绝

这是我的代码-我所要做的就是得到这个目录的总大小

class Program
{
      static void Main(string[] args)
      {
          try {
              // Make a reference to a directory.
              string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);              
              DirectoryInfo di = new DirectoryInfo(path);

              // Get a reference to each file in that directory.
              FileInfo[] fiArr = di.GetFiles(".", SearchOption.AllDirectories);

              // Display the names and sizes of the files.
              Console.WriteLine("The directory {0} contains the following files:", di.Name);

              long size = 0;
              foreach (FileInfo f in fiArr)
              {
                  size += f.Length;
                  size++;
              }
              Console.WriteLine("The size of desktop files." + size);
          }
          catch(Exception e)
          {
              Console.WriteLine("Exceptions {0}" , e);
          }         
      }    
}

搜索应仅在TopDirectoryOnly上,而不是在AllDirectory上

问题出在这一行:

FileInfo[]fiArr=di.GetFiles(“.”,SearchOption.AllDirectories)

将其更改为:

FileInfo[]fiArr=di.GetFiles(“.”,SearchOption.TopDirectoryOnly)


这应该有效。

搜索应该仅在TopDirectory上,而不是在所有目录上

问题出在这一行:

FileInfo[]fiArr=di.GetFiles(“.”,SearchOption.AllDirectories)

将其更改为:

FileInfo[]fiArr=di.GetFiles(“.”,SearchOption.TopDirectoryOnly)


这应该是可行的。

一些特殊文件夹需要特定的管理员权限才能正常运行。您必须以管理员权限运行代码。

某些特殊文件夹需要特定的管理员权限才能正常运行。您必须在管理员权限中运行代码。

从浏览中我可以了解到,这些文件夹可能是为实现Windows向后兼容性而提供的软链接

为了解决编码问题,您可以进行自己的递归文件夹搜索,该搜索忽略当前用户无权访问给定文件夹时引发的异常

也许是这样的:

    static IEnumerable<FileInfo> GetAllFilesRecursive(string path)
    {
        var di = new DirectoryInfo(path);
        var files = new List<FileInfo>();
        files.AddRange(di.GetFiles("."));

        foreach (var directory in Directory.GetDirectories(path))
        {
            try
            {
                files.AddRange(GetAllFilesRecursive(directory));
            }
            catch (UnauthorizedAccessException) // ignore directories which the user does not have access to
            {}

        }
        return files;
    }

我从浏览中得到的信息可能是,这些文件夹是为Windows向后兼容而提供的软链接

为了解决编码问题,您可以进行自己的递归文件夹搜索,该搜索忽略当前用户无权访问给定文件夹时引发的异常

也许是这样的:

    static IEnumerable<FileInfo> GetAllFilesRecursive(string path)
    {
        var di = new DirectoryInfo(path);
        var files = new List<FileInfo>();
        files.AddRange(di.GetFiles("."));

        foreach (var directory in Directory.GetDirectories(path))
        {
            try
            {
                files.AddRange(GetAllFilesRecursive(directory));
            }
            catch (UnauthorizedAccessException) // ignore directories which the user does not have access to
            {}

        }
        return files;
    }

您是否正在网络驱动器上运行此应用程序?如果是这样,请尝试将其复制到桌面,以查看行为是否发生变化。如果看不到,则也不希望使用代码查看。这是一个硬链接,不是目录。使用DirectoryInfo.Attributes,远离任何具有System或ReparsePoint属性的对象。龙住在那里。使用这个特殊的文件夹可能不是你在这里的最佳选择。看看这个问题,汉斯答对了。如果你注意到了,上面写着“我的音乐”。这不是物理文件夹--
C:\Users\YourName\Music
。“我的”文件夹都不是物理文件夹。“我的音乐”=“音乐”、“我的视频”=“视频”等。您可以通过在资源管理器中导航到链接,然后单击地址栏来查看链接的变化。此外,由于您使用的是
所有目录
,因此无法避免。您可能需要为子目录创建一个递归函数,以便跳过这些子目录。您是否在网络驱动器上运行此应用程序?如果是这样,请尝试将其复制到桌面,以查看行为是否发生变化。如果看不到,则也不希望使用代码查看。这是一个硬链接,不是目录。使用DirectoryInfo.Attributes,远离任何具有System或ReparsePoint属性的对象。龙住在那里。使用这个特殊的文件夹可能不是你在这里的最佳选择。看看这个问题,汉斯答对了。如果你注意到了,上面写着“我的音乐”。这不是物理文件夹--
C:\Users\YourName\Music
。“我的”文件夹都不是物理文件夹。“我的音乐”=“音乐”、“我的视频”=“视频”等。您可以通过在资源管理器中导航到链接,然后单击地址栏来查看链接的变化。此外,由于您使用的是
所有目录
,因此无法避免。您可能需要为子目录创建一个递归函数,以便可以跳过这些子目录。我也这样做了,但它会粘在一个物理上不存在的文件夹中。我也这样做了,但它会粘在一个物理上不存在的文件夹中。这对documents文件夹有效,但不适用于该目录中的子文件夹。这适用于documents文件夹,但不适用于该目录中的子文件夹。酷。很乐意帮忙!请记住勾选答案左侧的复选标记以接受它;-)酷。很乐意帮忙!请记住勾选答案左侧的复选标记以接受它;-)