4

ファイルを見つけるためにディレクトリ/サブディレクトリを検索する必要があります。ファイルが見つかったら停止することをお勧めします。

これは、不足しているDirectoryInfo.GetFilesに組み込まれている機能ですか、それとも他の機能(自己実装の再帰検索)を使用する必要がありますか?

4

3 に答える 3

13

代わりに、ファイルを遅延して返すものを使用してください(最初に完全なファイルリストをメモリに取り込むのとはDirectoryInfo.EnumerateFiles()対照的に)-必要なものを実現するために追加できます:GetFilesFirstOrDefault()

var firstTextFile = new DirectoryInfo(someDirectory).EnumerateFiles("*.txt")
                                                    .FirstOrDefault();

MSDNから:

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

DirectoryInfo.EnumerateFiles.NET 4.0が必要)

于 2012-02-02T22:10:47.500 に答える
4

.NET 4.0より前のバージョンで使用するのに最適な方法は、FindFirstFile()を使用することです。

    [DllImport("kernel32", CharSet = CharSet.Unicode)]
    public static extern IntPtr FindFirstFile(string lpFileName, out WIN32_FIND_DATA lpFindFileData);

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool FindClose(IntPtr hFindFile);

    public void findFile()
    {
        WIN32_FIND_DATA findData;
        var findHandle = FindFirstFile(@"\\?\" + directory + @"\*", out findData);
        FindClose(findHandle);
    }

この構造体が必要です

    //Struct layout required for FindFirstFile
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    struct WIN32_FIND_DATA
    {
        public uint dwFileAttributes;
        public System.Runtime.InteropServices.ComTypes.FILETIME ftCreationTime;
        public System.Runtime.InteropServices.ComTypes.FILETIME ftLastAccessTime;
        public System.Runtime.InteropServices.ComTypes.FILETIME ftLastWriteTime;
        public uint nFileSizeHigh;
        public uint nFileSizeLow;
        public uint dwReserved0;
        public uint dwReserved1;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
        public string cFileName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
        public string cAlternateFileName;
    }
于 2012-02-02T22:14:31.350 に答える
0

DirectoryInfo.GetFiles([Your Pattern]、SearchOption.AllDirectories).First();を試しましたか?

于 2012-02-02T22:13:00.250 に答える