Как удалить каталоги из EnumerateFiles? - PullRequest
0 голосов
/ 29 апреля 2018

Итак, я работаю над программой, которая перечислит все файлы в каталоге. Довольно просто По сути, когда я делаю это: List<string> dirs = new List<string>(Directory.EnumerateFiles(target));, я не хочу, чтобы он включал каталог и все. Просто имя файла. Когда я запускаю свой код;

    List<string> dirs = new List<string>(Directory.EnumerateFiles(target));
    Console.WriteLine($"Folders and files in this directory:\n");
    foreach (string i in dirs) {
        Console.WriteLine($"> {i}");
    }

это дает мне следующее:

C: \ Users \ Camden \ Desktop \ Programming \ Visual Studio \ C # \ DirectoryManager \ DirectoryManager \ bin \ Debug \ DirectoryManager.exe

Мне просто нужна часть DirectoryManager.exe, поэтому я посмотрел ее и обнаружил, что вы можете заменить строки внутри строк. Вот так: i.Replace(target, "");. Тем не менее, это ничего не делает, и просто работает как обычно. Почему он не заменяет, и как мне вместо этого сделать это?

Ответы [ 3 ]

0 голосов
/ 29 апреля 2018

Самый простой способ - использовать расширение Select IEnumerable
(вам нужно иметь using Linq; вверху вашего файла исходного кода)

List<string> files = new List<string>(Directory.EnumerateFiles(target)
                                      .Select(x => Path.GetFileName(x)));

Таким образом, последовательность файлов, извлеченных с помощью Directory.EnumerateFiles, передается один за другим в метод Select, где каждое полное имя файла (x) передается в Path.GetFileName для создания новой последовательности только имен файлов.
Затем эта последовательность возвращается в качестве параметра конструктору List.

А по поводу вашего вопроса о методе замены. Помните, что метод Replace не изменяет строку, которую вы используете для вызова метода, но возвращает новую строку с выполненной заменой. В NET строки неизменяемы.

Так что, если вы хотите посмотреть на замену, вам нужно

string justFileName = i.Replace(target, "");
0 голосов
/ 29 апреля 2018

Альтернативой использованию Directory.EnumerateFiles будет DirectoryInfo.EnumerateFiles. Этот метод возвращает IEnumerable<FileInfo>. Затем вы можете использовать свойство FileInfo.Name каждого из возвращаемых объектов. Ваш код станет:

var files = new DirectoryInfo(target).EnumerateFiles(); 
Console.WriteLine("Files in this directory:\n"); 
foreach (FileInfo i in files) { 
    Console.WriteLine($"> {i.Name}"); 
}

Только для списка имен файлов:

List<string> fileNames = new DirectoryInfo(target).EnumerateFiles().Select(f => f.Name).ToList();

В качестве альтернативы, если вам нужны оба каталога и , вы можете использовать EnumerateFileSystemInfos. Если вам нужно узнать, есть ли у вас файл или каталог, вы можете запросить свойство Attributes и сравнить его с перечислением флагов FileAttributes.

var dirsAndFiles = new DirectoryInfo(target).EnumerateFileSystemInfos(); 
Console.WriteLine("Folders and files in this directory:\n"); 
foreach (var i in dirsAndFiles) { 
    var type = (i.Attributes & FileAttributes.Directory) == FileAttributes.Directory ? "Directory" : "File";

    Console.WriteLine($"{type} > {i.Name}"); 
}

Свойство FileSystemInfo.Name будет возвращать либо имя файла (в случае файла), либо последний каталог в иерархии (для каталога) - так что просто имя подкаталога, а не полный путь (вместо этого "sub") "c: \ sub").

0 голосов
/ 29 апреля 2018

Использовать методы из класса System.IO.Path.

        var fullfile = @"C:\Users\Camden\Desktop\Programming\Visual Studio\C#\DirectoryManager\DirectoryManager\bin\Debug\DirectoryManager.exe";
        var fileName = Path.GetFileName(fullfile); // DirectoryManager.exe
        var name = Path.GetFileNameWithoutExtension(fullfile);  // DirectoryManager
...