파일을 찾으려면 디렉토리/하위 디렉토리를 검색해야하며 찾았 으면 중지하는 것이 좋습니다.DirectoryInfo.GetFiles를 사용하고 첫 번째 일치 항목을 찾은 후 중지하는 방법?
이 기능은 내가 누락 된 DirectoryInfo.GetFiles에 내장 된 기능입니까, 아니면 다른 것을 사용해야합니까? (자체 구현되는 재귀 적 검색)?
파일을 찾으려면 디렉토리/하위 디렉토리를 검색해야하며 찾았 으면 중지하는 것이 좋습니다.DirectoryInfo.GetFiles를 사용하고 첫 번째 일치 항목을 찾은 후 중지하는 방법?
이 기능은 내가 누락 된 DirectoryInfo.GetFiles에 내장 된 기능입니까, 아니면 다른 것을 사용해야합니까? (자체 구현되는 재귀 적 검색)?
사용 DirectoryInfo.EnumerateFiles()
대신 느리게 (먼저 메모리에 전체 파일 목록을 가져오고있다 GetFiles
반대) 파일을 반환하는 - 당신은 당신이 원하는 것을 달성하기 위해 FirstOrDefault()
을 추가 할 수 있습니다 MSDN에서
var firstTextFile = new DirectoryInfo(someDirectory).EnumerateFiles("*.txt")
.FirstOrDefault();
: 방법으로 다른
EnumerateFiles하고있는 GetFiles은 다음과 같습니다 당신 사용 EnumerateFiles, 당신은 전체 COL 전에 에서는 FileInfo 개체의 컬렉션을 열거 시작할 수 있습니다 때 lection이 반환됩니다. GetFiles를 사용할 때 배열에 액세스하기 전에 FileInfo 개체의 전체 배열이 이 반환 될 때까지 기다려야합니다. 따라서 많은 파일과 디렉터리로 작업 할 때 일 경우 EnumerateFiles는 효율적으로 이 될 수 있습니다.
()
이 ([귀하의 패턴] SearchOption.AllDirectories을) 당신이 DirectoryInfo.GetFiles를 시도 좁은 방을 (DirectoryInfo.EnumerateFiles
는 .NET 4.0 필요); 도시 된 바와 같이
가장 좋은 방법은 pre-.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);
}
닷넷 3.5 이하의 경우,이 구조체
//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;
}
4.0이 필요하지만 위대한 답을 얻으려고 +1 할뿐 아니라 다른 사람들에게도 도움이되기를 바랍니다. – RiddlerDev
와우! 이것은 훌륭한 대답입니다! –
필요 사용하기 FindFirstFile을()를 사용하여 내 아래 예. – Corylulu