Directory.EnumerateFiles 方法

定义

返回满足指定条件的完整文件名的可枚举集合。

重载

名称 说明
EnumerateFiles(String, String, SearchOption)

返回与指定路径中的搜索模式匹配的完整文件名的可枚举集合,并选择性地搜索子目录。

EnumerateFiles(String, String, EnumerationOptions)

返回与指定路径中的搜索模式和枚举选项匹配的完整文件名的可枚举集合,并选择性地搜索子目录。

EnumerateFiles(String)

返回指定路径中完整文件名的可枚举集合。

EnumerateFiles(String, String)

返回与指定路径中的搜索模式匹配的完整文件名的可枚举集合。

EnumerateFiles(String, String, SearchOption)

Source:
Directory.cs
Source:
Directory.cs
Source:
Directory.cs
Source:
Directory.cs
Source:
Directory.cs

返回与指定路径中的搜索模式匹配的完整文件名的可枚举集合,并选择性地搜索子目录。

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

枚举值之一,指定搜索操作是否应仅包括当前目录,还是应包含所有子目录。 默认值为 TopDirectoryOnly

返回

目录中文件 path 的完整名称(包括路径)的可枚举集合,与指定的搜索模式和搜索选项匹配。

例外

.NET Framework 和低于 2.1 的核心版本:.NET path是长度为零的字符串,仅包含空格或包含无效字符。 可以使用该方法 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

通配符说明符 Matches
* (星号) 该位置中的零个或多个字符。
? (问号) 该位置正好有一个字符。

通配符以外的字符是文本字符。 例如, searchPattern 字符串“*t”搜索以字母“t”结尾的所有名称 pathsearchPattern字符串“s*”搜索以字母“s”开头的所有名称path

注释

.NET Framework only: 当你在 searchPattern 中使用星号通配符时,并且指定了三个字符的文件扩展名(例如“*.txt”)时,此方法还返回扩展名为 begin的文件。 例如,搜索模式“*.xls”返回“book.xls”和“book.xlsx”。 仅当搜索模式中使用星号且提供的文件扩展名正好是三个字符时,才会发生此行为。 如果在搜索模式中某个位置使用问号通配符,此方法仅返回与指定文件扩展名完全匹配的文件。 下表描述了 .NET Framework 中的此异常。

目录中的文件 搜索模式 .NET 5 个以上的返回 .NET Framework 返回
file.ai,file.aif *。艾 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不能以两个句点(“..”)结尾,或者包含两个句点(“..”)后跟DirectorySeparatorCharAltDirectorySeparatorChar,也不能包含任何无效字符。 可以使用该方法 GetInvalidPathChars 查询无效字符。

可以使用参数指定相对路径信息 path 。 相对路径信息被解释为相对于当前工作目录,可以使用该方法来确定该 GetCurrentDirectory 目录。

方法和EnumerateFilesGetFiles方法不同,如下所示:使用EnumerateFiles时,可以在返回整个集合之前开始枚举名称集合。 使用 GetFiles时,必须先等待返回整个名称数组,然后才能访问该数组。 因此,处理许多文件和目录时, EnumerateFiles 可以更高效。

未缓存返回的集合。 每次对集合的 GetEnumerator 调用都会启动一个新的枚举。

适用于

EnumerateFiles(String, String, EnumerationOptions)

Source:
Directory.cs
Source:
Directory.cs
Source:
Directory.cs
Source:
Directory.cs
Source:
Directory.cs

返回与指定路径中的搜索模式和枚举选项匹配的完整文件名的可枚举集合,并选择性地搜索子目录。

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 和低于 2.1 的核心版本:.NET path是长度为零的字符串,仅包含空格或包含无效字符。 可以使用该方法 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

通配符说明符 Matches
* (星号) 该位置中的零个或多个字符。
? (问号) 该位置正好有一个字符。

通配符以外的字符是文本字符。 例如, searchPattern 字符串“*t”搜索以字母“t”结尾的所有名称 pathsearchPattern字符串“s*”搜索以字母“s”开头的所有名称path

注释

.NET Framework only: 当你在 searchPattern 中使用星号通配符时,并且指定了三个字符的文件扩展名(例如“*.txt”)时,此方法还返回扩展名为 begin的文件。 例如,搜索模式“*.xls”返回“book.xls”和“book.xlsx”。 仅当搜索模式中使用星号且提供的文件扩展名正好是三个字符时,才会发生此行为。 如果在搜索模式中某个位置使用问号通配符,此方法仅返回与指定文件扩展名完全匹配的文件。 下表描述了 .NET Framework 中的此异常。

目录中的文件 搜索模式 .NET 5 个以上的返回 .NET Framework 返回
file.ai,file.aif *。艾 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不能以两个句点(“..”)结尾,或者包含两个句点(“..”)后跟DirectorySeparatorCharAltDirectorySeparatorChar,也不能包含任何无效字符。 可以使用该方法 GetInvalidPathChars 查询无效字符。

可以使用参数指定相对路径信息 path 。 相对路径信息被解释为相对于当前工作目录,可以使用该方法来确定该 GetCurrentDirectory 目录。

方法和EnumerateFilesGetFiles方法不同,如下所示:使用EnumerateFiles时,可以在返回整个集合之前开始枚举名称集合。 使用 GetFiles时,必须先等待返回整个名称数组,然后才能访问该数组。 因此,处理许多文件和目录时, EnumerateFiles 可以更高效。

未缓存返回的集合。 每次对集合的 GetEnumerator 调用都会启动一个新的枚举。

适用于

EnumerateFiles(String)

Source:
Directory.cs
Source:
Directory.cs
Source:
Directory.cs
Source:
Directory.cs
Source:
Directory.cs

返回指定路径中完整文件名的可枚举集合。

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 和低于 2.1 的核心版本:.NET path是长度为零的字符串,仅包含空格或包含无效字符。 可以使用该方法 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 目录。

方法和EnumerateFilesGetFiles方法不同,如下所示:使用EnumerateFiles时,可以在返回整个集合之前开始枚举名称集合。 使用 GetFiles时,必须先等待返回整个名称数组,然后才能访问该数组。 因此,处理许多文件和目录时, EnumerateFiles 可以更高效。

未缓存返回的集合;每次对集合的 GetEnumerator 调用都将启动一个新的枚举。

适用于

EnumerateFiles(String, String)

Source:
Directory.cs
Source:
Directory.cs
Source:
Directory.cs
Source:
Directory.cs
Source:
Directory.cs

返回与指定路径中的搜索模式匹配的完整文件名的可枚举集合。

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 和低于 2.1 的核心版本:.NET path是长度为零的字符串,仅包含空格或包含无效字符。 可以使用该方法 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

通配符说明符 Matches
* (星号) 该位置中的零个或多个字符。
? (问号) 该位置正好有一个字符。

通配符以外的字符是文本字符。 例如, searchPattern 字符串“*t”搜索以字母“t”结尾的所有名称 pathsearchPattern字符串“s*”搜索以字母“s”开头的所有名称path

注释

.NET Framework only: 当你在 searchPattern 中使用星号通配符时,并且指定了三个字符的文件扩展名(例如“*.txt”)时,此方法还返回扩展名为 begin的文件。 例如,搜索模式“*.xls”返回“book.xls”和“book.xlsx”。 仅当搜索模式中使用星号且提供的文件扩展名正好是三个字符时,才会发生此行为。 如果在搜索模式中某个位置使用问号通配符,此方法仅返回与指定文件扩展名完全匹配的文件。 下表描述了 .NET Framework 中的此异常。

目录中的文件 搜索模式 .NET 5 个以上的返回 .NET Framework 返回
file.ai,file.aif *。艾 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不能以两个句点(“..”)结尾,或者包含两个句点(“..”)后跟DirectorySeparatorCharAltDirectorySeparatorChar,也不能包含任何无效字符。 可以使用该方法 GetInvalidPathChars 查询无效字符。

可以使用参数指定相对路径信息 path 。 相对路径信息被解释为相对于当前工作目录,可以使用该方法来确定该 GetCurrentDirectory 目录。

方法和EnumerateFilesGetFiles方法有所不同:使用EnumerateFiles时,可以在返回整个集合之前开始枚举名称集合;使用GetFiles时,必须先等待返回整个名称数组,然后才能访问数组。 因此,处理许多文件和目录时, EnumerateFiles 可以更高效。

未缓存返回的集合。 每次对集合的 GetEnumerator 调用都会启动一个新的枚举。

适用于