ファイルを見つけるためにディレクトリ/サブディレクトリを検索する必要があります。ファイルが見つかったら停止することをお勧めします。
これは、不足しているDirectoryInfo.GetFilesに組み込まれている機能ですか、それとも他の機能(自己実装の再帰検索)を使用する必要がありますか?
ファイルを見つけるためにディレクトリ/サブディレクトリを検索する必要があります。ファイルが見つかったら停止することをお勧めします。
これは、不足しているDirectoryInfo.GetFilesに組み込まれている機能ですか、それとも他の機能(自己実装の再帰検索)を使用する必要がありますか?
代わりに、ファイルを遅延して返すものを使用してください(最初に完全なファイルリストをメモリに取り込むのとはDirectoryInfo.EnumerateFiles()
対照的に)-必要なものを実現するために追加できます:GetFiles
FirstOrDefault()
var firstTextFile = new DirectoryInfo(someDirectory).EnumerateFiles("*.txt")
.FirstOrDefault();
MSDNから:
EnumerateFilesメソッドとGetFilesメソッドは次のように異なります。EnumerateFilesを使用すると、コレクション全体が返される前に、FileInfoオブジェクトのコレクションの列挙を開始できます。GetFilesを使用する場合、配列にアクセスする前に、FileInfoオブジェクトの配列全体が返されるのを待つ必要があります。したがって、多くのファイルやディレクトリを操作している場合は、EnumerateFilesの方が効率的です。
(DirectoryInfo.EnumerateFiles
.NET 4.0が必要)
.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;
}
DirectoryInfo.GetFiles([Your Pattern]、SearchOption.AllDirectories).First();を試しましたか?