Возникла ошибка «Доступ к пути 'C: \ Users \ Work & School \ Documents \ My Musi c' запрещен». C# - Консоль приложения - PullRequest
1 голос
/ 29 мая 2020

я учусь на уроке от Microsoft "https://docs.microsoft.com/en-us/dotnet/standard/io/how-to-enumerate-directories-and-files"

В частности, этот:

using System;
using System.IO;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            // Set a variable to the My Documents path.
            string docPath =
            Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

            var files = from file in Directory.EnumerateFiles(docPath, "*.txt", SearchOption.AllDirectories)
                        from line in File.ReadLines(file)
                        where line.Contains("Microsoft")
                        select new
                        {
                            File = file,
                            Line = line
                        };

            foreach (var f in files)
            {
                Console.WriteLine($"{f.File}\t{f.Line}");
            }
            Console.WriteLine($"{files.Count().ToString()} files found.");
        }
        catch (UnauthorizedAccessException uAEx)
        {
            Console.WriteLine(uAEx.Message);
        }
        catch (PathTooLongException pathEx)
        {
            Console.WriteLine(pathEx.Message);
        }
    }
}

Однако, когда я запускаю этот файл, Я столкнулся с ошибкой:

Доступ к пути 'C: \ Users \ Work & School \ Documents \ My Musi c' запрещен.

Мне интересно, почему он получает доступ к папке My Musi c в первую очередь, когда все, что он должен делать, - это документы? Кроме того, я также попытался удалить папку Musi c из отдельной папки, но все равно получаю ту же ошибку. Я также поместил два текстовых файла в папку с документами, в обоих было указано «Microsoft», чтобы они возвращали значения из строк. Как бы избавиться от ошибки?

* для текстовых файлов я также отключил атрибут readonly

1 Ответ

2 голосов
/ 29 мая 2020

, почему он в первую очередь обращается к папке My Musi c?

Из-за вашего SearchOption. SeachOption.AllDirectories ищет файл в текущем каталоге, а также во всех его подкаталогах.

Если вы хотите искать только в текущем каталоге, а не в его подкаталогах, тогда измените SearchOption на SeachOption.TopDirectoryOnly

Ваш обновленный код должен выглядеть так:

 var files = from file in Directory.EnumerateFiles(docPath, "*.txt", SearchOption.TopDirectoryOnly)
           from line in File.ReadLines(file)
           where line.Contains("Microsoft")
           select new
           {
                 File = file,
                 Line = line
           };

SearchOption Enum (из MSDN)

...