Gewusst wie: Auflisten von Verzeichnissen und Dateien

Ab .NET Framework, Version 4 können Verzeichnisse und Dateien mit Methoden aufgelistet werden, bei denen eine aufzählbare Auflistung der Zeichenfolgen ihrer Namen zurückgegeben wird. Sie können auch Methoden verwenden, bei denen eine aufzählbare Auflistung von folgenden Objekten zurückgegeben wird: DirectoryInfo, FileInfo oder FileSystemInfo. In früheren Versionen von .NET Framework konnten nur Arrays dieser Auflistungen abgerufen werden. Aufzählbare Auflistungen bieten eine bessere Leistung als Arrays.

Sie können auch aufzählbare Auflistungen verwenden, die von diesen Methoden abgerufen werden, um den IEnumerable<T>-Parameter für Konstruktoren von Auflistungsklassen bereitzustellen, z. B. die List<T>-Klasse.

Wenn Sie nur die Namen von Verzeichnissen oder Dateien abrufen möchten, verwenden Sie die Enumerationsmethoden der Directory-Klasse. Wenn Sie andere Eigenschaften von Verzeichnissen oder Dateien abrufen möchten, verwenden Sie die DirectoryInfo-Klasse und die FileSystemInfo-Klasse. Sie können auch die Zeilen einer Textdatei auflisten.

Die folgende Tabelle enthält Informationen zu den Methoden, von denen aufzählbare Auflistungen zurückgegeben werden.

Aufzulistendes

Aufzählbare Auflistung, die zurückgegeben werden soll

Zu verwendende Methode

Verzeichnisse

Verzeichnisnamen

Directory.EnumerateDirectories

Verzeichnisinformationen (DirectoryInfo).

DirectoryInfo.EnumerateDirectories

Dateien

Dateinamen

Directory.EnumerateFiles

Dateiinformationen (FileInfo).

DirectoryInfo.EnumerateFiles

Dateisysteminformationen

Dateisystemeinträge

Directory.EnumerateFileSystemEntries

Dateisysteminformationen (FileSystemInfo).

DirectoryInfo.EnumerateFileSystemInfos

Zeilen aus einer Textdatei

Zeilen aus einer Datei.

File.ReadLines

Obwohl Sie umgehend alle Dateien in den Unterverzeichnissen eines übergeordneten Verzeichnisses mit der AllDirectories-Option auflisten können, kann die Enumeration aufgrund nicht autorisierter Zugriffsausnahmen(UnauthorizedAccessException) unter Umständen unvollständig sein. Wenn diese Ausnahmen möglich sind, können Sie sie erfassen und fortsetzen, indem zuerst Verzeichnisse und anschließend Dateien aufgelistet werden.

Wenn Sie Windows XP oder früher ausführen, kann ein Löschvorgang einer Datei oder eines Verzeichnisses mit Enumerationen fehlschlagen, wenn ein geöffnetes Handle vorhanden ist, das in einem der aufgelisteten Verzeichnisse oder Dateien verbleibt. In diesem Fall müssen Sie eine Garbage Collection auslösen, um die geöffneten Handles zu entfernen.

So listen Sie Verzeichnisnamen auf

  • Verwenden Sie die Directory.EnumerateDirectories(String)-Methode, um eine Liste der Verzeichnisnamen der obersten Ebene in einem angegebenen Pfad abzurufen.

    Imports System.Collections.Generic
    Imports System.IO
    Imports System.Linq
    
    Module Module1
    
        Sub Main()
            Try
                Dim dirPath As String = "\\archives\2009\reports"
    
                ' LINQ query.
                Dim dirs = From folder In _
                    Directory.EnumerateDirectories(dirPath)
                For Each folder In dirs
                    ' Remove path information from string.
                    Console.WriteLine("{0}", _
                            folder.Substring(folder.LastIndexOf("\") + 1))
                Next
                Console.WriteLine("{0} directories found.", _
                    dirs.Count.ToString())
    
                ' Optionally create a List collection.
                Dim workDirs As List(Of String) = New List(Of String)(dirs)
    
            Catch UAEx As UnauthorizedAccessException
                Console.WriteLine(UAEx.Message)
            Catch PathEx As PathTooLongException
                Console.WriteLine(PathEx.Message)
            End Try
        End Sub
    End Module
    
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    
    class Program
    {
    
        private static void Main(string[] args)
        {
            try
            {
                string dirPath = @"\\archives\2009\reports";
    
                // LINQ query.
                var dirs = from dir in 
                         Directory.EnumerateDirectories(dirPath)
                           select dir;
    
                // Show results.
                foreach (var dir in dirs)
                {
                    // Remove path information from string.
                    Console.WriteLine("{0}", 
                        dir.Substring(dir.LastIndexOf("\\") + 1));
    
                }
                Console.WriteLine("{0} directories found.", 
                    dirs.Count<string>().ToString());
    
                // Optionally create a List collection.
                List<string> workDirs = new List<string>(dirs);
            }
            catch (UnauthorizedAccessException UAEx)
            {
                Console.WriteLine(UAEx.Message);
            }
            catch (PathTooLongException PathEx)
            {
                Console.WriteLine(PathEx.Message);
            }
        }
    }
    

So listen Sie Dateinamen in allen Verzeichnissen auf

  • Verwenden Sie die Directory.EnumerateFiles(String, String, SearchOption)-Methode, um alle Verzeichnisse zu durchsuchen, um eine Liste von Dateinamen in einem angegebenen Pfad abzurufen, die einem angegebenen Suchmuster entsprechen.

    Imports System.IO
    Imports System.Xml.Linq
    Module Module1
    
        Sub Main()
    
            Try
                Dim files = From chkFile In Directory.EnumerateFiles("c:\", "*.txt", _
                                                     SearchOption.AllDirectories)
                            From line In File.ReadLines(chkFile)
                            Where line.Contains("Microsoft")
                            Select New With {.curFile = chkFile, .curLine = line}
    
                For Each f In files
                    Console.WriteLine("{0}\t{1}", f.curFile, f.curLine)
                Next
                Console.WriteLine("{0} files found.", _
                        files.Count.ToString())
            Catch UAEx As UnauthorizedAccessException
                Console.WriteLine(UAEx.Message)
            Catch PathEx As PathTooLongException
                Console.WriteLine(PathEx.Message)
            End Try
        End Sub
    End Module
    
    using System;
    using System.IO;
    using System.Linq;
    
    class Program
    {
        static void Main(string[] args)
        {
    
            try
            {
                var files = from file in Directory.EnumerateFiles(@"c:\",
                                "*.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("{0}\t{1}", f.File, f.Line);
                }
                Console.WriteLine("{0} files found.", 
                    files.Count().ToString());
            }
            catch (UnauthorizedAccessException UAEx)
            {
                Console.WriteLine(UAEx.Message);
            }
            catch (PathTooLongException PathEx)
            {
                Console.WriteLine(PathEx.Message);
            }
        }
    }
    

So listen Sie eine Auflistung von DirectoryInfo-Objekten auf

  • Verwenden Sie die DirectoryInfo.EnumerateDirectories-Methode, um eine Auflistung von Verzeichnissen der obersten Ebene abzurufen.

    ' Create a DirectoryInfo of the Program Files directory.
    Dim dirPrograms As New DirectoryInfo("c:\program files")
    
    Dim StartOf2009 As New DateTime(2009, 1, 1)
    
    ' LINQ query for all directories created before 2009.
    Dim dirs = From dir In dirPrograms.EnumerateDirectories()
                Where dir.CreationTimeUtc < StartOf2009
    
    ' Show results.
    For Each di As DirectoryInfo In dirs
        Console.WriteLine("{0}", di.Name)
    Next
    
    // Create a DirectoryInfo of the Program Files directory.
    DirectoryInfo dirPrograms = new DirectoryInfo(@"c:\program files");
    
    DateTime StartOf2009 = new DateTime(2009, 01, 01);
    
    // LINQ query for all directories created before 2009.
    var dirs = from dir in dirPrograms.EnumerateDirectories()
                where dir.CreationTimeUtc < StartOf2009
                select new
                {
                    ProgDir = dir,
                };
    // Show results.
    foreach (var di in dirs)
    {
        Console.WriteLine("{0}", di.ProgDir.Name);
    }
    

So listen Sie eine Auflistung von FileInfo-Objekten in allen Verzeichnissen auf

  • Verwenden Sie die DirectoryInfo.EnumerateFiles-Methode, um eine Auflistung von Dateien abzurufen, die in allen Verzeichnissen einem angegebenen Suchmuster entsprechen. In diesem Beispiel werden zuerst die Verzeichnisse der obersten Ebene aufgelistet, um mögliche nicht autorisierte Zugriffsausnahmen zu erfassen, und anschließend werden die Dateien aufgelistet.

    Imports System
    Imports System.IO
    
    Class Program
        Public Shared Sub Main(ByVal args As String())
            ' Create a DirectoryInfo object of the starting directory.
            Dim diTop As New DirectoryInfo("d:\")
            Try
                ' Enumerate the files just in the top directory.
                For Each fi In diTop.EnumerateFiles()
                    Try
                        ' Display each file over 10 MB;
                        If fi.Length > 10000000 Then
                            Console.WriteLine("{0}" & vbTab & vbTab & "{1}", 
                            fi.FullName, fi.Length.ToString("N0"))
                        End If
                    ' Catch unauthorized access to a file.
                    Catch UnAuthTop As UnauthorizedAccessException
                        Console.WriteLine("{0}", UnAuthTop.Message)
                    End Try
                Next
                ' Enumerate all subdirectories.
                For Each di In diTop.EnumerateDirectories("*")
                    Try
                        ' Enumerate each file in each subdirectory.
                        For Each fi In di.EnumerateFiles("*", 
                                    SearchOption.AllDirectories)
                            Try
                                ' // Display each file over 10 MB;
                                If fi.Length > 10000000 Then
                                    Console.WriteLine("{0}" & vbTab &
                                    vbTab & "{1}", 
                                    fi.FullName, fi.Length.ToString("N0"))
                                End If
                            ' Catch unauthorized access to a file.
                            Catch UnAuthFile As UnauthorizedAccessException
                                Console.WriteLine("UnAuthFile: {0}",
                                                    UnAuthFile.Message)
                            End Try
                        Next
                    ' Catch unauthorized access to a subdirectory.
                    Catch UnAuthSubDir As UnauthorizedAccessException
                        Console.WriteLine("UnAuthSubDir: {0}", 
                                                UnAuthSubDir.Message)
                    End Try
                Next
            ' Catch error in directory path.
            Catch DirNotFound As DirectoryNotFoundException
                Console.WriteLine("{0}", DirNotFound.Message)
            ' Catch unauthorized access to a first tier directory. 
            Catch UnAuthDir As UnauthorizedAccessException
                Console.WriteLine("UnAuthDir: {0}", UnAuthDir.Message)
            ' Catch paths that are too long.
            Catch LongPath As PathTooLongException
                Console.WriteLine("{0}", LongPath.Message)
            End Try
        End Sub
    End Class
    
    using System;
    using System.IO;
    
    class Program
    {
        static void Main(string[] args)
        {
            // Create a DirectoryInfo object of the starting directory.
            DirectoryInfo diTop = new DirectoryInfo(@"d:\");
            try
            {
                // Enumerate the files just in the top directory.
                foreach (var fi in diTop.EnumerateFiles())
                {
                    try
                    {
                        // Display each file over 10 MB;
                        if (fi.Length > 10000000)
                        {
                            Console.WriteLine("{0}\t\t{1}", fi.FullName, 
                                            fi.Length.ToString("N0"));
                        }
                    }
                    // Catch unauthorized access to a file.
                    catch (UnauthorizedAccessException UnAuthTop)
                    {
                        Console.WriteLine("{0}", UnAuthTop.Message);
                    }
                }
                // Enumerate all subdirectories.
                foreach (var di in diTop.EnumerateDirectories("*"))
                {
                    try
                    {
                        // Enumerate each file in each subdirectory.
                        foreach (var fi in di.EnumerateFiles("*",
                                        SearchOption.AllDirectories))
                        {
                            try
                            {
                                // Display each file over 10 MB;
                                if (fi.Length > 10000000)
                                {
                                    Console.WriteLine("{0}\t\t{1}", 
                                      fi.FullName, fi.Length.ToString("N0"));
                                }
                            }
                             // Catch unauthorized access to a file.
                            catch (UnauthorizedAccessException UnAuthFile)
                            {
                                Console.WriteLine("UnAuthFile: {0}", 
                                                UnAuthFile.Message);
                            }
                        }
                    }
                    // Catch unauthorized access to a subdirectory.
                    catch (UnauthorizedAccessException UnAuthSubDir)
                    {
                        Console.WriteLine("UnAuthSubDir: {0}", 
                                                UnAuthSubDir.Message);
                    }
                }
            }
            // Catch error in directory path.
            catch (DirectoryNotFoundException DirNotFound)
            {
                Console.WriteLine("{0}", DirNotFound.Message);
            }
            // Catch unauthorized access to a first tier directory. 
            catch (UnauthorizedAccessException UnAuthDir)
            {
                Console.WriteLine("UnAuthDir: {0}", UnAuthDir.Message);
            }
            // Catch paths that are too long. 
            catch (PathTooLongException LongPath)
            {
                Console.WriteLine("{0}", LongPath.Message);
            }
    
        }
    }
    

So entfernen Sie geöffnete Handles für aufgelistete Verzeichnisse oder Dateien

  1. Erstellen Sie eine benutzerdefinierte Methode (oder eine Funktion in Visual Basic), die den Enumerationscode enthalten soll.

  2. Wenden Sie das MethodImplAttribute-Attribut mit der NoInlining-Option auf die neue Methode an. Beispiel:

    [MethodImplAttribute(MethodImplOptions.NoInlining)]
    Private void Enumerate()
    
  3. Schließen Sie die folgenden Methodenaufrufe für die Ausführung nach dem Enumerationscode ein:

Siehe auch

Konzepte

Grundlegende Datei-E/A