Directory.EnumerateFiles メソッド

定義

指定した条件を満たす完全なファイル名の列挙可能なコレクションを返します。

オーバーロード

名前 説明
EnumerateFiles(String, String, EnumerationOptions)

指定したパス内の検索パターンと列挙オプションに一致する完全なファイル名の列挙可能なコレクションを返し、必要に応じてサブディレクトリを検索します。

EnumerateFiles(String, String, SearchOption)

指定したパス内の検索パターンに一致する完全なファイル名の列挙可能なコレクションを返し、必要に応じてサブディレクトリを検索します。

EnumerateFiles(String)

指定したパス内の完全なファイル名の列挙可能なコレクションを返します。

EnumerateFiles(String, String)

指定したパス内の検索パターンに一致する完全なファイル名の列挙可能なコレクションを返します。

EnumerateFiles(String, String, EnumerationOptions)

指定したパス内の検索パターンと列挙オプションに一致する完全なファイル名の列挙可能なコレクションを返し、必要に応じてサブディレクトリを検索します。

public:
 static System::Collections::Generic::IEnumerable<System::String ^> ^ EnumerateFiles(System::String ^ path, System::String ^ searchPattern, System::IO::EnumerationOptions ^ enumerationOptions);
public static System.Collections.Generic.IEnumerable<string> EnumerateFiles(string path, string searchPattern, System.IO.EnumerationOptions enumerationOptions);
static member EnumerateFiles : string * string * System.IO.EnumerationOptions -> seq<string>
Public Shared Function EnumerateFiles (path As String, searchPattern As String, enumerationOptions As EnumerationOptions) As IEnumerable(Of String)

パラメーター

path
String

検索するディレクトリへの相対パスまたは絶対パス。 この文字列では大文字と小文字は区別されません。

searchPattern
String

path内のファイル名と照合する検索文字列。 このパラメーターには、有効なリテラル パスとワイルドカード (* および ?) 文字の組み合わせを含めることができますが、正規表現はサポートされていません。

enumerationOptions
EnumerationOptions

使用する検索と列挙の構成を記述するオブジェクト。

返品

指定した検索パターンと列挙オプションに一致する、 path で指定されたディレクトリ内のファイルの完全名 (パスを含む) の列挙可能なコレクション。

例外

.NET Framework および .NET Core バージョンが 2.1 より前の場合: path は長さ 0 の文字列で、空白のみを含むか、無効な文字を含みます。 GetInvalidPathChars() メソッドを使用して、無効な文字のクエリを実行できます。

-または-

searchPattern には有効なパターンが含まれていません。

pathnullです。

-または-

searchPatternnullです。

path は、マップされていないドライブを参照するなど、無効です。

path はファイル名です。

指定したパス、ファイル名、または組み合わせが、システム定義の最大長を超えています。

呼び出し元に必要なアクセス許可がありません。

次の例は、ディレクトリとそのサブディレクトリ内のすべてのテキスト ファイルを取得し、新しいディレクトリに移動する方法を示しています。 ファイルが移動されると、元のディレクトリに存在しなくなります。

using System;
using System.IO;

partial class Example1
{
    static void EnumerationOptionsExample()
    {
        string sourceDirectory = @"C:\current";
        string archiveDirectory = @"C:\archive";

        var options = new EnumerationOptions
        {
            MatchCasing = MatchCasing.CaseInsensitive,
            MatchType = MatchType.Simple,
            RecurseSubdirectories = true
        };

        try
        {
            var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.txt", options);

            foreach (string currentFile in txtFiles)
            {
                string fileName = currentFile.Substring(sourceDirectory.Length + 1);
                Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName));
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}
open System.IO

let sourceDirectory = @"C:\current"
let archiveDirectory = @"C:\archive"

let options = new EnumerationOptions(
    MatchCasing = MatchCasing.CaseInsensitive,
    MatchType = MatchType.Simple,
    RecurseSubdirectories = true
)

try
    let txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.txt", options)

    for currentFile in txtFiles do
        let fileName = currentFile.Substring(sourceDirectory.Length + 1)
        Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName))
with ex ->
    printfn $"{ex.Message}"
Imports System.IO

Partial Class Example1
    Shared Sub EnumerationOptionsExample()

        Dim sourceDirectory As String = "C:\current"
        Dim archiveDirectory As String = "C:\archive"

        Dim options As New EnumerationOptions() With {
            .MatchCasing = MatchCasing.CaseInsensitive,
            .MatchType = MatchType.Simple,
            .RecurseSubdirectories = True
        }

        Try
            Dim txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.txt", options)

            For Each currentFile As String In txtFiles
                Dim fileName = currentFile.Substring(sourceDirectory.Length + 1)
                Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName))
            Next
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try

    End Sub
End Class

次の例では、アクセスできないディレクトリとファイルを無視して、 .txt 拡張子を持つすべてのファイルを再帰的に列挙します。 ファイルの各行を読み取り、文字列 "Microsoft" が含まれている場合は行を表示します。

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

partial class Example2
{
    static void EnumerationOptionsExample()
    {
        try
        {
            // Set a variable to the My Documents path.
            string docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

            // Set the options for the enumeration.
            var options = new EnumerationOptions
            {
                IgnoreInaccessible = true,
                MatchCasing = MatchCasing.CaseInsensitive,
                MatchType = MatchType.Simple,
                RecurseSubdirectories = true
            };

            var files = from file in Directory.EnumerateFiles(docPath, "*.txt", options)
                        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()} files found.");
        }
        catch (PathTooLongException pathEx)
        {
            Console.WriteLine(pathEx.Message);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}
open System
open System.IO

try
    // Set a variable to the My Documents path.
    let docPath =
        Environment.GetFolderPath Environment.SpecialFolder.MyDocuments

    // Set the options for the enumeration.
    let options = new EnumerationOptions(
        IgnoreInaccessible = true,
        MatchCasing = MatchCasing.CaseInsensitive,
        MatchType = MatchType.Simple,
        RecurseSubdirectories = true
    )

    let files =
        query {
            for file in Directory.EnumerateFiles(docPath, "*.txt", options) do
            for line in File.ReadLines file do
            where (line.Contains "Microsoft")
            select {| File = file; Line = line |}
        }

    for f in files do
        printfn $"{f.File}\t{f.Line}"

    printfn $"{Seq.length files} files found."
with
| :? PathTooLongException as pathEx -> printfn $"{pathEx.Message}"
| ex -> printfn $"{ex.Message}"
Imports System.IO
Imports System.Xml.Linq

Partial Class Example2
    Shared Sub EnumerationOptionsExample()

        Try
            ' Set a variable to the My Documents Path.
            Dim docPath As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)

            ' Set the options for the enumeration.
            Dim options As New EnumerationOptions() With {
                .IgnoreInaccessible = True,
                .MatchCasing = MatchCasing.CaseInsensitive,
                .MatchType = MatchType.Simple,
                .RecurseSubdirectories = True
            }

            Dim files = From chkFile In Directory.EnumerateFiles(docPath, "*.txt", options)
                        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.curFile}\t{f.curLine}")
            Next

            Console.WriteLine($"{files.Count} files found.")
        Catch pathEx As PathTooLongException
            Console.WriteLine(pathEx.Message)
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try

    End Sub
End Class

注釈

searchPattern にはリテラル文字とワイルドカード文字の組み合わせを指定できますが、正規表現はサポートされていません。 searchPatternでは、次のワイルドカード指定子を使用できます。

ワイルドカード指定子 一致
* (アスタリスク) その位置の 0 個以上の文字。
? (疑問符) その位置に 1 文字だけ入力します。

ワイルドカード以外の文字はリテラル文字です。 たとえば、 searchPattern 文字列 "*t" は、文字 "t" で終わる path 内のすべての名前を検索します。 searchPattern文字列 "s*" は、文字 "s" で始まるpath内のすべての名前を検索します。

Note

.NET Framework のみ:searchPattern でアスタリスクワイルドカード文字を使用し、3 文字のファイル拡張子 ("*.txt" など) を指定すると、このメソッドは指定した拡張子を持つ拡張子beginのファイルも返します。 たとえば、検索パターン "*.xls" は"book.xls" と "book.xlsx" の両方を返します。 この動作は、検索パターンでアスタリスクが使用され、指定されたファイル拡張子が 3 文字の場合にのみ発生します。 検索パターンのどこかで疑問符ワイルドカード文字を使用する場合、このメソッドは指定されたファイル拡張子と完全に一致するファイルのみを返します。 次の表は、.NET Framework でのこの異常を示しています。

ディレクトリ内のファイル 検索パターン .NET 5 以上の戻り値 .NET Framework が返す
file.ai、file.aif *。Ai file.ai file.ai
book.xls、book.xlsx *.xls book.xls book.xls、book.xlsx
ello.txt、hello.txt、hello.txtt ?ello.txt hello.txt hello.txt

searchPattern は、2 つのピリオド ("..") で終わることはできません。または、2 つのピリオド ("..") の後に DirectorySeparatorChar または AltDirectorySeparatorCharを含めることはできません。また、無効な文字を含めることもできます。 GetInvalidPathChars メソッドを使用して、無効な文字のクエリを実行できます。

path パラメーターを使用して相対パス情報を指定できます。 相対パス情報は、現在の作業ディレクトリに対する相対パスとして解釈されます。これは、 GetCurrentDirectory メソッドを使用して判断できます。

EnumerateFilesメソッドとGetFiles メソッドは次のように異なります。EnumerateFilesを使用すると、コレクション全体が返される前に名前のコレクションの列挙を開始できます。 GetFilesを使用する場合は、配列にアクセスする前に、名前の配列全体が返されるのを待つ必要があります。 そのため、多くのファイルやディレクトリを操作する場合は、 EnumerateFiles の方が効率的です。

返されたコレクションはキャッシュされません。 コレクションの GetEnumerator を呼び出すたびに、新しい列挙型が開始されます。

適用対象

EnumerateFiles(String, String, SearchOption)

指定したパス内の検索パターンに一致する完全なファイル名の列挙可能なコレクションを返し、必要に応じてサブディレクトリを検索します。

public:
 static System::Collections::Generic::IEnumerable<System::String ^> ^ EnumerateFiles(System::String ^ path, System::String ^ searchPattern, System::IO::SearchOption searchOption);
public static System.Collections.Generic.IEnumerable<string> EnumerateFiles(string path, string searchPattern, System.IO.SearchOption searchOption);
static member EnumerateFiles : string * string * System.IO.SearchOption -> seq<string>
Public Shared Function EnumerateFiles (path As String, searchPattern As String, searchOption As SearchOption) As IEnumerable(Of String)

パラメーター

path
String

検索するディレクトリへの相対パスまたは絶対パス。 この文字列では大文字と小文字は区別されません。

searchPattern
String

path内のファイル名と照合する検索文字列。 このパラメーターには、有効なリテラル パスとワイルドカード (* および ?) 文字の組み合わせを含めることができますが、正規表現はサポートされていません。

searchOption
SearchOption

検索操作に現在のディレクトリのみを含めるか、すべてのサブディレクトリを含めるかを指定する列挙値の 1 つ。 既定値は TopDirectoryOnly です。

返品

指定した検索パターンと検索オプションに一致する、 path で指定されたディレクトリ内のファイルの完全名 (パスを含む) の列挙可能なコレクション。

例外

.NET Framework および .NET Core バージョンが 2.1 より前の場合: path は長さ 0 の文字列で、空白のみを含むか、無効な文字を含みます。 GetInvalidPathChars() メソッドを使用して、無効な文字のクエリを実行できます。

-または-

searchPattern には有効なパターンが含まれていません。

pathnullです。

-または-

searchPatternnullです。

searchOption が有効な SearchOption 値ではありません。

path は、マップされていないドライブを参照するなど、無効です。

path はファイル名です。

指定したパス、ファイル名、または組み合わせが、システム定義の最大長を超えています。

呼び出し元に必要なアクセス許可がありません。

呼び出し元に必要なアクセス許可がありません。

次の例は、ディレクトリとそのサブディレクトリ内のすべてのテキスト ファイルを取得し、新しいディレクトリに移動する方法を示しています。 ファイルが移動されると、元のディレクトリに存在しなくなります。

using System;
using System.IO;

partial class Example1
{
    static void SearchOptionExample()
    {
        string sourceDirectory = @"C:\current";
        string archiveDirectory = @"C:\archive";

        try
        {
            var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.txt", SearchOption.AllDirectories);

            foreach (string currentFile in txtFiles)
            {
                string fileName = currentFile.Substring(sourceDirectory.Length + 1);
                Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName));
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }
}
open System.IO

let sourceDirectory = @"C:\current"
let archiveDirectory = @"C:\archive"

try
    let txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.txt", SearchOption.AllDirectories)

    for currentFile in txtFiles do
        let fileName = currentFile.Substring(sourceDirectory.Length + 1)
        Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName))
with e ->
    printfn $"{e.Message}"
Imports System.IO

Partial Class Example1
    Shared Sub SearchOptionsExample()

        Dim sourceDirectory As String = "C:\current"
        Dim archiveDirectory As String = "C:\archive"

        Try
            Dim txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.txt", SearchOption.AllDirectories)

            For Each currentFile As String In txtFiles
                Dim fileName = currentFile.Substring(sourceDirectory.Length + 1)
                Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName))
            Next
        Catch e As Exception
            Console.WriteLine(e.Message)
        End Try

    End Sub
End Class

次の例では、拡張子.txtを持つすべてのファイルを再帰的に列挙し、ファイルの各行を読み取り、文字列 "Microsoft" が含まれている場合は行を表示します。

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

partial class Example2
{
    static void SearchOptionExample()
    {
        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()} files found.");
        }
        catch (UnauthorizedAccessException uAEx)
        {
            Console.WriteLine(uAEx.Message);
        }
        catch (PathTooLongException pathEx)
        {
            Console.WriteLine(pathEx.Message);
        }
    }
}
open System
open System.IO

try
    // Set a variable to the My Documents path.
    let docPath =
        Environment.GetFolderPath Environment.SpecialFolder.MyDocuments

    let files =
        query {
            for file in Directory.EnumerateFiles(docPath, "*.txt", SearchOption.AllDirectories) do
            for line in File.ReadLines file do
            where (line.Contains "Microsoft")
            select {| File = file; Line = line |}
        }

    for f in files do
        printfn $"{f.File}\t{f.Line}"
    printfn $"{Seq.length files} files found."

with
| :? UnauthorizedAccessException as uAEx -> printfn $"{uAEx.Message}"
| :? PathTooLongException as pathEx -> printfn $"{pathEx.Message}"
Imports System.IO
Imports System.Xml.Linq

Partial Class Example2
    Shared Sub SearchOptionExample()

        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.curFile}\t{f.curLine}")
            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 Class

注釈

searchPattern にはリテラル文字とワイルドカード文字の組み合わせを指定できますが、正規表現はサポートされていません。 searchPatternでは、次のワイルドカード指定子を使用できます。

ワイルドカード指定子 一致
* (アスタリスク) その位置の 0 個以上の文字。
? (疑問符) その位置に 1 文字だけ入力します。

ワイルドカード以外の文字はリテラル文字です。 たとえば、 searchPattern 文字列 "*t" は、文字 "t" で終わる path 内のすべての名前を検索します。 searchPattern文字列 "s*" は、文字 "s" で始まるpath内のすべての名前を検索します。

Note

.NET Framework のみ:searchPattern でアスタリスクワイルドカード文字を使用し、3 文字のファイル拡張子 ("*.txt" など) を指定すると、このメソッドは指定した拡張子を持つ拡張子beginのファイルも返します。 たとえば、検索パターン "*.xls" は"book.xls" と "book.xlsx" の両方を返します。 この動作は、検索パターンでアスタリスクが使用され、指定されたファイル拡張子が 3 文字の場合にのみ発生します。 検索パターンのどこかで疑問符ワイルドカード文字を使用する場合、このメソッドは指定されたファイル拡張子と完全に一致するファイルのみを返します。 次の表は、.NET Framework でのこの異常を示しています。

ディレクトリ内のファイル 検索パターン .NET 5 以上の戻り値 .NET Framework が返す
file.ai、file.aif *。Ai file.ai file.ai
book.xls、book.xlsx *.xls book.xls book.xls、book.xlsx
ello.txt、hello.txt、hello.txtt ?ello.txt hello.txt hello.txt

searchPattern は、2 つのピリオド ("..") で終わることはできません。または、2 つのピリオド ("..") の後に DirectorySeparatorChar または AltDirectorySeparatorCharを含めることはできません。また、無効な文字を含めることもできます。 GetInvalidPathChars メソッドを使用して、無効な文字のクエリを実行できます。

path パラメーターを使用して相対パス情報を指定できます。 相対パス情報は、現在の作業ディレクトリに対する相対パスとして解釈されます。これは、 GetCurrentDirectory メソッドを使用して判断できます。

EnumerateFilesメソッドとGetFiles メソッドは次のように異なります。EnumerateFilesを使用すると、コレクション全体が返される前に名前のコレクションの列挙を開始できます。 GetFilesを使用する場合は、配列にアクセスする前に、名前の配列全体が返されるのを待つ必要があります。 そのため、多くのファイルやディレクトリを操作する場合は、 EnumerateFiles の方が効率的です。

返されたコレクションはキャッシュされません。 コレクションの GetEnumerator を呼び出すたびに、新しい列挙型が開始されます。

適用対象

EnumerateFiles(String)

指定したパス内の完全なファイル名の列挙可能なコレクションを返します。

public:
 static System::Collections::Generic::IEnumerable<System::String ^> ^ EnumerateFiles(System::String ^ path);
public static System.Collections.Generic.IEnumerable<string> EnumerateFiles(string path);
static member EnumerateFiles : string -> seq<string>
Public Shared Function EnumerateFiles (path As String) As IEnumerable(Of String)

パラメーター

path
String

検索するディレクトリへの相対パスまたは絶対パス。 この文字列では大文字と小文字は区別されません。

返品

pathで指定されたディレクトリ内のファイルの完全名 (パスを含む) の列挙可能なコレクション。

例外

.NET Framework および .NET Core バージョンが 2.1 より前の場合: path は長さ 0 の文字列で、空白のみを含むか、無効な文字を含みます。 GetInvalidPathChars() メソッドを使用して、無効な文字のクエリを実行できます。

pathnullです。

path は、マップされていないドライブを参照するなど、無効です。

path はファイル名です。

指定したパス、ファイル名、または組み合わせが、システム定義の最大長を超えています。

呼び出し元に必要なアクセス許可がありません。

呼び出し元に必要なアクセス許可がありません。

次の例は、ディレクトリ内のすべてのファイルを取得し、新しいディレクトリに移動する方法を示しています。 ファイルが移動されると、元のディレクトリに存在しなくなります。

using System;
using System.IO;

partial class Example1
{
    static void OneStringExample()
    {
        string sourceDirectory = @"C:\current";
        string archiveDirectory = @"C:\archive";

        try
        {
            var txtFiles = Directory.EnumerateFiles(sourceDirectory);

            foreach (string currentFile in txtFiles)
            {
                string fileName = currentFile.Substring(sourceDirectory.Length + 1);
                Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName));
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }
}
open System.IO

let sourceDirectory = @"C:\current"
let archiveDirectory = @"C:\archive"

try
    let txtFiles = Directory.EnumerateFiles sourceDirectory

    for currentFile in txtFiles do
        let fileName = currentFile.Substring(sourceDirectory.Length + 1)
        Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName))
with e ->
    printfn $"{e.Message}"
Imports System.IO

Partial Class Example1
    Shared Sub OneStringExample()

        Dim sourceDirectory As String = "C:\current"
        Dim archiveDirectory As String = "C:\archive"

        Try
            Dim txtFiles = Directory.EnumerateFiles(sourceDirectory)

            For Each currentFile As String In txtFiles
                Dim fileName = currentFile.Substring(sourceDirectory.Length + 1)
                Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName))
            Next
        Catch e As Exception
            Console.WriteLine(e.Message)
        End Try

    End Sub
End Class

次の例では、指定したディレクトリ内のファイルを列挙し、ファイルの各行を読み取り、文字列 "Europe" が含まれている場合は行を表示します。

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

partial class Example2
{
    static void OneStringExample()
    {
        try
        {
            // LINQ query for all files containing the word 'Europe'.
            var files = from file in Directory.EnumerateFiles(@"\\archives1\library\")
                        where file.ToLower().Contains("europe")
                        select file;

            foreach (var file in files)
            {
                Console.WriteLine("{0}", file);
            }

            Console.WriteLine("{0} files found.", files.Count<string>().ToString());
        }
        catch (UnauthorizedAccessException UAEx)
        {
            Console.WriteLine(UAEx.Message);
        }
        catch (PathTooLongException PathEx)
        {
            Console.WriteLine(PathEx.Message);
        }
    }
}
open System
open System.IO

try
    // All files containing the word 'Europe'.
    let files =
        Directory.EnumerateFiles @"\\archives1\library\"
        |> Seq.filter (fun file -> file.ToLower().Contains "europe")

    for file in files do
        printfn $"{file}"
    printfn $"{Seq.length files} files found."

with 
| :? UnauthorizedAccessException as uaEx ->
    printfn $"{uaEx.Message}"
| :? PathTooLongException as pathEx ->
    printfn $"{pathEx.Message}"
Imports System.IO
Imports System.Linq

Partial Class Example2
    Shared Sub OneStringExample()

        Try
            ' LINQ query for all files containing the word 'Europe'.
            Dim files = From file In Directory.EnumerateFiles("\\archives1\library\")
                        Where file.ToLower().Contains("europe")

            For Each file In files
                Console.WriteLine("{0}", file)
            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 Class

注釈

path パラメーターを使用して相対パス情報を指定できます。 相対パス情報は、現在の作業ディレクトリに対する相対パスとして解釈されます。これは、 GetCurrentDirectory メソッドを使用して判断できます。

EnumerateFilesメソッドとGetFiles メソッドは次のように異なります。EnumerateFilesを使用すると、コレクション全体が返される前に名前のコレクションの列挙を開始できます。 GetFilesを使用する場合は、配列にアクセスする前に、名前の配列全体が返されるのを待つ必要があります。 そのため、多くのファイルやディレクトリを操作する場合は、 EnumerateFiles の方が効率的です。

返されたコレクションはキャッシュされません。コレクションの GetEnumerator を呼び出すたびに、新しい列挙が開始されます。

適用対象

EnumerateFiles(String, String)

指定したパス内の検索パターンに一致する完全なファイル名の列挙可能なコレクションを返します。

public:
 static System::Collections::Generic::IEnumerable<System::String ^> ^ EnumerateFiles(System::String ^ path, System::String ^ searchPattern);
public static System.Collections.Generic.IEnumerable<string> EnumerateFiles(string path, string searchPattern);
static member EnumerateFiles : string * string -> seq<string>
Public Shared Function EnumerateFiles (path As String, searchPattern As String) As IEnumerable(Of String)

パラメーター

path
String

検索するディレクトリへの相対パスまたは絶対パス。 この文字列では大文字と小文字は区別されません。

searchPattern
String

path内のファイル名と照合する検索文字列。 このパラメーターには、有効なリテラル パスとワイルドカード (* および ?) 文字の組み合わせを含めることができますが、正規表現はサポートされていません。

返品

指定した検索パターンに一致する、 path で指定されたディレクトリ内のファイルの完全名 (パスを含む) の列挙可能なコレクション。

例外

.NET Framework および .NET Core バージョンが 2.1 より前の場合: path は長さ 0 の文字列で、空白のみを含むか、無効な文字を含みます。 GetInvalidPathChars() メソッドを使用して、無効な文字のクエリを実行できます。

-または-

searchPattern には有効なパターンが含まれていません。

pathnullです。

-または-

searchPatternnullです。

path は、マップされていないドライブを参照するなど、無効です。

path はファイル名です。

指定したパス、ファイル名、または組み合わせが、システム定義の最大長を超えています。

呼び出し元に必要なアクセス許可がありません。

呼び出し元に必要なアクセス許可がありません。

次の例は、ディレクトリ内のすべてのテキスト ファイルを取得し、新しいディレクトリに移動する方法を示しています。 ファイルが移動されると、元のディレクトリに存在しなくなります。

using System;
using System.IO;

partial class Example1
{
    static void TwoStringsExample()
    {
        string sourceDirectory = @"C:\current";
        string archiveDirectory = @"C:\archive";

        try
        {
            var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.txt");

            foreach (string currentFile in txtFiles)
            {
                string fileName = currentFile.Substring(sourceDirectory.Length + 1);
                Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName));
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }
}
open System.IO

let sourceDirectory = @"C:\current"
let archiveDirectory = @"C:\archive"

try
    let txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.txt")

    for currentFile in txtFiles do
        let fileName = currentFile.Substring(sourceDirectory.Length + 1)
        Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName))

with e ->
    printfn $"{e.Message}"
Imports System.IO

Partial Class Example1
    Shared Sub TwoStringExample()

        Dim sourceDirectory As String = "C:\current"
        Dim archiveDirectory As String = "C:\archive"

        Try
            Dim txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.txt")

            For Each currentFile As String In txtFiles
                Dim fileName = currentFile.Substring(sourceDirectory.Length + 1)
                Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName))
            Next
        Catch e As Exception
            Console.WriteLine(e.Message)
        End Try

    End Sub
End Class

次の例では、".txt" 拡張子を持つ指定したディレクトリ内のファイルを列挙し、ファイルの各行を読み取り、文字列 "Europe" が含まれている場合は行を表示します。

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

partial class Example2
{
    static void TwoStringsExample()
    {
        try
        {
            // LINQ query for all .txt files containing the word 'Europe'.
            var files = from file in Directory.EnumerateFiles(@"\\archives1\library\", "*.txt")
                        where file.ToLower().Contains("europe")
                        select file;

            foreach (var file in files)
            {
                Console.WriteLine("{0}", file);
            }

            Console.WriteLine("{0} files found.", files.Count<string>().ToString());
        }

        catch (UnauthorizedAccessException UAEx)
        {
            Console.WriteLine(UAEx.Message);
        }
        catch (PathTooLongException PathEx)
        {
            Console.WriteLine(PathEx.Message);
        }
    }
}
open System
open System.IO

try
    // All .txt files containing the word 'Europe'.
    let files = 
        Directory.EnumerateFiles(@"\\archives1\library\", "*.txt")
        |> Seq.filter(fun file -> file.ToLower().Contains "europe")

    for file in files do
        printfn $"{file}"
    printfn $"{Seq.length files} files found."

with
| :? UnauthorizedAccessException as uaEx ->
    printfn $"{uaEx.Message}"
| :? PathTooLongException as pathEx ->
    printfn $"{pathEx.Message}"
Imports System.IO
Imports System.Linq

Partial Class Example2
    Shared Sub TwoStringsExample()

        Try
            ' LINQ query for all .txt files containing the word 'Europe'.
            Dim files = From file In Directory.EnumerateFiles("\\archives1\library\", "*.txt")
                        Where file.ToLower().Contains("europe")

            For Each file In files
                Console.WriteLine("{0}", file)
            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 Class

注釈

searchPattern にはリテラル文字とワイルドカード文字の組み合わせを指定できますが、正規表現はサポートされていません。 searchPatternでは、次のワイルドカード指定子を使用できます。

ワイルドカード指定子 一致
* (アスタリスク) その位置の 0 個以上の文字。
? (疑問符) その位置に 1 文字だけ入力します。

ワイルドカード以外の文字はリテラル文字です。 たとえば、 searchPattern 文字列 "*t" は、文字 "t" で終わる path 内のすべての名前を検索します。 searchPattern文字列 "s*" は、文字 "s" で始まるpath内のすべての名前を検索します。

Note

.NET Framework のみ:searchPattern でアスタリスクワイルドカード文字を使用し、3 文字のファイル拡張子 ("*.txt" など) を指定すると、このメソッドは指定した拡張子を持つ拡張子beginのファイルも返します。 たとえば、検索パターン "*.xls" は"book.xls" と "book.xlsx" の両方を返します。 この動作は、検索パターンでアスタリスクが使用され、指定されたファイル拡張子が 3 文字の場合にのみ発生します。 検索パターンのどこかで疑問符ワイルドカード文字を使用する場合、このメソッドは指定されたファイル拡張子と完全に一致するファイルのみを返します。 次の表は、.NET Framework でのこの異常を示しています。

ディレクトリ内のファイル 検索パターン .NET 5 以上の戻り値 .NET Framework が返す
file.ai、file.aif *。Ai file.ai file.ai
book.xls、book.xlsx *.xls book.xls book.xls、book.xlsx
ello.txt、hello.txt、hello.txtt ?ello.txt hello.txt hello.txt

searchPattern は、2 つのピリオド ("..") で終わることはできません。または、2 つのピリオド ("..") の後に DirectorySeparatorChar または AltDirectorySeparatorCharを含めることはできません。また、無効な文字を含めることもできます。 GetInvalidPathChars メソッドを使用して、無効な文字のクエリを実行できます。

path パラメーターを使用して相対パス情報を指定できます。 相対パス情報は、現在の作業ディレクトリに対する相対パスとして解釈されます。これは、 GetCurrentDirectory メソッドを使用して判断できます。

EnumerateFilesメソッドとGetFilesメソッドは次のように異なります。EnumerateFilesを使用すると、コレクション全体が返される前に名前のコレクションの列挙を開始できます。GetFilesを使用する場合は、配列にアクセスする前に、名前の配列全体が返されるのを待つ必要があります。 そのため、多くのファイルやディレクトリを操作する場合は、 EnumerateFiles の方が効率的です。

返されたコレクションはキャッシュされません。 コレクションの GetEnumerator を呼び出すたびに、新しい列挙型が開始されます。

適用対象