簡體   English   中英

如何從EnumerateFiles中刪除目錄?

[英]How to Remove Directories From EnumerateFiles?

因此,我正在開發一個程序,該程序將列出目錄中的所有文件。 很簡單 基本上,當我這樣做時: 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, ""); 但是,這沒有做任何事情,只是正常運行。 為什么不替換呢?我應該怎么做呢?

使用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

最簡單的方法是使用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方法的問題。 請記住,Replace方法不會更改用於調用該方法的字符串,而是返回執行了替換操作的新字符串。 在NET中,字符串是不可變的。

因此,如果您要查看替換產品,則需要

string justFileName = i.Replace(target, "");

使用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“)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM