방법: 디렉터리 및 파일 열거How to: Enumerate directories and files

열거 가능한 컬렉션은 대규모의 디렉터리 및 파일 컬렉션으로 작업할 때 배열보다 나은 성능을 제공합니다.Enumerable collections provide better performance than arrays when you work with large collections of directories and files. 디렉터리 및 파일을 열거하려면 디렉터리, 파일 이름이나 해당 DirectoryInfo, FileInfo 또는 FileSystemInfo 개체의 열거할 수 있는 컬렉션을 반환하는 메서드를 사용합니다.To enumerate directories and files, use methods that return an enumerable collection of directory or file names, or their DirectoryInfo, FileInfo, or FileSystemInfo objects.

디렉터리 또는 파일의 이름만 검색하고 반환하려면 Directory 클래스의 열거 메서드를 사용합니다.If you want to search and return only the names of directories or files, use the enumeration methods of the Directory class. 디렉터리 또는 파일의 다른 속성을 검색하고 반환하려면 DirectoryInfoFileSystemInfo 클래스를 사용합니다.If you want to search and return other properties of directories or files, use the DirectoryInfo and FileSystemInfo classes.

이러한 메서드의 열거 가능한 컬렉션은 List<T>과 같은 컬렉션 클래스의 생성자에 대한 IEnumerable<T> 매개 변수로 사용할 수 있습니다.You can use enumerable collections from these methods as the IEnumerable<T> parameter for constructors of collection classes like List<T>.

다음 표에는 열거 가능한 파일 및 디렉터리 컬렉션을 반환하는 메서드가 요약되어 있습니다.The following table summarizes the methods that return enumerable collections of files and directories:

검색 및 반환하려면To search and return 메서드 사용Use method
디렉터리 이름Directory names Directory.EnumerateDirectories
디렉터리 정보(DirectoryInfo)Directory information (DirectoryInfo) DirectoryInfo.EnumerateDirectories
파일 이름File names Directory.EnumerateFiles
파일 정보(FileInfo)File information (FileInfo) DirectoryInfo.EnumerateFiles
파일 시스템 항목 이름File system entry names Directory.EnumerateFileSystemEntries
파일 시스템 항목 정보(FileSystemInfo)File system entry information (FileSystemInfo) DirectoryInfo.EnumerateFileSystemInfos
디렉터리 및 파일 이름Directory and file names Directory.EnumerateFileSystemEntries

참고

선택적 SearchOption 열거형의 AllDirectories 옵션을 사용하면 부모 디렉터리의 하위 디렉터리에 있는 모든 파일을 즉시 열거할 수 있지만, UnauthorizedAccessException 오류로 인해 열거가 불완전할 수 있습니다.Although you can immediately enumerate all the files in the subdirectories of a parent directory by using the AllDirectories option of the optional SearchOption enumeration, UnauthorizedAccessException errors may make the enumeration incomplete. 먼저 디렉터리를 열거한 다음, 파일을 열거하면 이러한 예외를 catch할 수 있습니다.You can catch these exceptions by first enumerating directories and then enumerating files.

예: 디렉터리 클래스 사용Examples: Use the Directory class

다음 예제에서는 Directory.EnumerateDirectories(String) 메서드를 사용하여 지정된 경로의 최상위 디렉터리 이름 목록을 가져옵니다.The following example uses the Directory.EnumerateDirectories(String) method to get a list of the top-level directory names in a specified path.

using System;
using System.Collections.Generic;
using System.IO;

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

            List<string> dirs = new List<string>(Directory.EnumerateDirectories(docPath));
                    
            foreach (var dir in dirs)
            {
                Console.WriteLine($"{dir.Substring(dir.LastIndexOf(Path.DirectorySeparatorChar) + 1)}");
            }
            Console.WriteLine($"{dirs.Count} directories found.");
        }
        catch (UnauthorizedAccessException ex)
        {
            Console.WriteLine(ex.Message);
        }
        catch (PathTooLongException ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}
Imports System.Collections.Generic
Imports System.IO

Module Module1

    Sub Main()
        Try
            Dim dirPath As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)

            Dim dirs As List(Of String) = New List(Of String)(Directory.EnumerateDirectories(dirPath))

            For Each folder In dirs
                Console.WriteLine($"{dir.Substring(dir.LastIndexOf(Path.DirectorySeparatorChar) + 1)}")
            Next
            Console.WriteLine($"{dirs.Count} directories found.")
        Catch ex As UnauthorizedAccessException
            Console.WriteLine(ex.Message)
        Catch ex As PathTooLongException
            Console.WriteLine(ex.Message)
        End Try

    End Sub
End Module

다음 예제에서는 Directory.EnumerateFiles(String, String, SearchOption) 메서드를 사용하여 특정 패턴과 일치하는 디렉터리 및 하위 디렉터리의 모든 파일 이름을 재귀적으로 열거합니다.The following example uses the Directory.EnumerateFiles(String, String, SearchOption) method to recursively enumerate all file names in a directory and subdirectories that match a certain pattern. 그런 다음, 각 파일의 각 줄을 읽고 해당 파일 이름 및 경로가 있는 지정된 문자열이 포함된 줄을 표시합니다.It then reads each line of each file and displays the lines that contain a specified string, with their filenames and paths.

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);
        }
    }
}
Imports System.IO
Imports System.Xml.Linq

Module Module1

    Sub Main()
        Try
            Dim docPath As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
            Dim files = From chkFile In Directory.EnumerateFiles(docPath, "*.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($"{f.File}\t{f.Line}")
            Next
            Console.WriteLine($"{files.Count} files found.")
        Catch uAEx As UnauthorizedAccessException
            Console.WriteLine(uAEx.Message)
        Catch pathEx As PathTooLongException
            Console.WriteLine(pathEx.Message)
        End Try
    End Sub
End Module

예: DirectoryInfo 클래스 사용Examples: Use the DirectoryInfo class

다음 예제에서는 DirectoryInfo.EnumerateDirectories 메서드를 사용하여 CreationTimeUtc가 특정 DateTime 값보다 이전인 최상위 디렉터리의 컬렉션을 나열합니다.The following example uses the DirectoryInfo.EnumerateDirectories method to list a collection of top-level directories whose CreationTimeUtc is earlier than a certain DateTime value.

using System;
using System.IO;

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

            DirectoryInfo dirPrograms = new DirectoryInfo(docPath);
            DateTime StartOf2009 = new DateTime(2009, 01, 01);

            var dirs = from dir in dirPrograms.EnumerateDirectories()
            where dir.CreationTimeUtc > StartOf2009
            select new
            {
                ProgDir = dir,
            };

            foreach (var di in dirs)
            {
                Console.WriteLine($"{di.ProgDir.Name}");
            }

        }
    }
}
// </Snippet1>
Imports System.IO

Module Module1

    Sub Main()

        Dim dirPath As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
        Dim dirPrograms As New DirectoryInfo(dirPath)
        Dim StartOf2009 As New DateTime(2009, 1, 1)

        Dim dirs = From dir In dirPrograms.EnumerateDirectories()
                   Where dir.CreationTimeUtc > StartOf2009

        For Each di As DirectoryInfo In dirs
            Console.WriteLine("{0}", di.Name)
        Next

    End Sub

End Module

다음 예제에서는 DirectoryInfo.EnumerateFiles 메서드를 사용하여 Length가 10MB를 초과하는 모든 파일을 나열합니다.The following example uses the DirectoryInfo.EnumerateFiles method to list all files whose Length exceeds 10MB. 이 예제는 먼저 최상위 디렉터리를 열거하여 가능한 권한 없는 액세스 예외를 catch하고 파일을 열거합니다.This example first enumerates the top-level directories, to catch possible unauthorized access exceptions, and then enumerates the files.

using System;
using System.IO;

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

        DirectoryInfo diTop = new DirectoryInfo(docPath);

        try
        {
            foreach (var fi in diTop.EnumerateFiles())
            {
                try
                {
                    // Display each file over 10 MB;
                    if (fi.Length > 10000000)
                    {
                        Console.WriteLine($"{fi.FullName}\t\t{fi.Length.ToString("NO")}");
                    }
                }
                catch (UnauthorizedAccessException unAuthTop)
                {
                    Console.WriteLine($"{unAuthTop.Message}");
                }
            }
            
            foreach (var di in diTop.EnumerateDirectories("*"))
            {
                try
                {
                    foreach (var fi in di.EnumerateFiles("*", SearchOption.AllDirectories))
                    {
                        try
                        {
                            // Display each file over 10 MB;
                            if (fi.Length > 10000000)
                            {
                                Console.WriteLine($"{fi.FullName}\t\t{fi.Length.ToString("NO")}");
                            }
                        }
                        catch (UnauthorizedAccessException unAuthFile)
                        {
                            Console.WriteLine($"unAuthFile: {unAuthFile.Message}");
                        }
                    }
                }
                catch (UnauthorizedAccessException unAuthSubDir)
                {
                    Console.WriteLine($"unAuthSubDir: {unAuthSubDir.Message}");
                }
            }
        }
        catch (DirectoryNotFoundException dirNotFound)
        {
            Console.WriteLine($"{dirNotFound.Message}");
        }
        catch (UnauthorizedAccessException unAuthDir)
        {
            Console.WriteLine($"unAuthDir: {unAuthDir.Message}");
        }
        catch (PathTooLongException longPath)
        {
            Console.WriteLine($"{longPath.Message}");
        }
    }
}
Imports System.IO

Class Program
    Public Shared Sub Main(ByVal args As String())
        Dim dirPath As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
        Dim diTop As New DirectoryInfo(dirPath)
        Try
            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 unAuthTop As UnauthorizedAccessException
                    Console.WriteLine($"{unAuthTop.Message}")
                End Try
            Next

            For Each di In diTop.EnumerateDirectories("*")
                Try
                    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 unAuthFile As UnauthorizedAccessException
                            Console.WriteLine($"unAuthFile: {unAuthFile.Message}")
                        End Try
                    Next
                Catch unAuthSubDir As UnauthorizedAccessException
                    Console.WriteLine($"unAuthSubDir: {unAuthSubDir.Message}")
                End Try
            Next
        Catch dirNotFound As DirectoryNotFoundException
            Console.WriteLine($"{dirNotFound.Message}")
        Catch unAuthDir As UnauthorizedAccessException
            Console.WriteLine($"unAuthDir: {unAuthDir.Message}")
        Catch longPath As PathTooLongException
            Console.WriteLine($"{longPath.Message}")
        End Try
    End Sub
End Class

참조See also