[c#] 폴더의 파일 수
C #과 함께 ASP.NET을 사용하여 폴더에서 파일 수를 얻으려면 어떻게합니까?
답변
System.IO.Directory myDir = GetMyDirectoryForTheExample();
int count = myDir.GetFiles().Length;
답변
Directory.GetFiles 메서드를 사용할 수 있습니다.
Directory.GetFiles 메서드 (String, String, SearchOption) 도 참조하십시오.
이 오버로드에서 검색 옵션을 지정할 수 있습니다.
TopDirectoryOnly : 검색에 현재 디렉토리 만 포함합니다.
AllDirectories : 검색 작업에 현재 디렉터리와 모든 하위 디렉터리를 포함합니다. 이 옵션에는 검색에 탑재 된 드라이브 및 심볼릭 링크와 같은 재분석 지점이 포함됩니다.
// searches the current directory and sub directory
int fCount = Directory.GetFiles(path, "*", SearchOption.AllDirectories).Length;
// searches the current directory
int fCount = Directory.GetFiles(path, "*", SearchOption.TopDirectoryOnly).Length;
답변
가장 매끄러운 방법은 LINQ 를 사용하는 것입니다 .
var fileCount = (from file in Directory.EnumerateFiles(@"H:\iPod_Control\Music", "*.mp3", SearchOption.AllDirectories)
select file).Count();
답변
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo("SourcePath");
int count = dir.GetFiles().Length;
이것을 사용할 수 있습니다.
답변
디렉토리에서 PDF 파일 읽기 :
var list = Directory.GetFiles(@"C:\ScanPDF", "*.pdf");
if (list.Length > 0)
{
}
답변
.NET 메서드 Directory.GetFiles (dir) 또는 DirectoryInfo.GetFiles ()는 총 파일 수를 얻는 데 그리 빠르지 않습니다. 이 파일 수 방법을 매우 많이 사용하는 경우 WinAPI를 직접 사용하여 약 50 %의 시간을 절약 할 수 있습니다.
다음은 C # 메서드에 대한 WinAPI 호출을 캡슐화하는 WinAPI 접근 방식입니다.
int GetFileCount(string dir, bool includeSubdirectories = false)
완전한 코드 :
[Serializable, StructLayout(LayoutKind.Sequential)]
private struct WIN32_FIND_DATA
{
public int dwFileAttributes;
public int ftCreationTime_dwLowDateTime;
public int ftCreationTime_dwHighDateTime;
public int ftLastAccessTime_dwLowDateTime;
public int ftLastAccessTime_dwHighDateTime;
public int ftLastWriteTime_dwLowDateTime;
public int ftLastWriteTime_dwHighDateTime;
public int nFileSizeHigh;
public int nFileSizeLow;
public int dwReserved0;
public int dwReserved1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string cFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
public string cAlternateFileName;
}
[DllImport("kernel32.dll")]
private static extern IntPtr FindFirstFile(string pFileName, ref WIN32_FIND_DATA pFindFileData);
[DllImport("kernel32.dll")]
private static extern bool FindNextFile(IntPtr hFindFile, ref WIN32_FIND_DATA lpFindFileData);
[DllImport("kernel32.dll")]
private static extern bool FindClose(IntPtr hFindFile);
private static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
private const int FILE_ATTRIBUTE_DIRECTORY = 16;
private int GetFileCount(string dir, bool includeSubdirectories = false)
{
string searchPattern = Path.Combine(dir, "*");
var findFileData = new WIN32_FIND_DATA();
IntPtr hFindFile = FindFirstFile(searchPattern, ref findFileData);
if (hFindFile == INVALID_HANDLE_VALUE)
throw new Exception("Directory not found: " + dir);
int fileCount = 0;
do
{
if (findFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
{
fileCount++;
continue;
}
if (includeSubdirectories && findFileData.cFileName != "." && findFileData.cFileName != "..")
{
string subDir = Path.Combine(dir, findFileData.cFileName);
fileCount += GetFileCount(subDir, true);
}
}
while (FindNextFile(hFindFile, ref findFileData));
FindClose(hFindFile);
return fileCount;
}
내 컴퓨터에서 13000 개의 파일이있는 폴더에서 검색 할 때-평균 : 110ms
int fileCount = GetFileCount(searchDir, true); // using WinAPI
.NET 기본 제공 메서드 : Directory.GetFiles (dir)-평균 : 230ms
int fileCount = Directory.GetFiles(searchDir, "*", SearchOption.AllDirectories).Length;
참고 : 하드 드라이브가 섹터를 찾는 데 약간 더 오래 걸리기 때문에 두 방법 중 하나를 처음 실행하면 각각 60 %-100 % 느려집니다. 후속 호출은 Windows에서 세미 캐시됩니다.
답변
int fileCount = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Length; // Will Retrieve count of all files in directry and sub directries
int fileCount = Directory.GetFiles(path, "*.*", SearchOption.TopDirectory).Length; // Will Retrieve count of all files in directry but not sub directries
int fileCount = Directory.GetFiles(path, "*.xml", SearchOption.AllDirectories).Length; // Will Retrieve count of files XML extension in directry and sub directries