文件夹中的文件数

Sre*_*mar 70 c# asp.net

如何使用带有C#的ASP.NET从文件夹中获取文件数?

rah*_*hul 117

您可以使用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;
Run Code Online (Sandbox Code Playgroud)

  • 这似乎包括子文件夹的数量。也就是说,我有一个子文件夹,并且位于一个空目录中,并且返回 1。 (2认同)
  • 要获得更节省资源的最新解决方案,请将 GetFiles() 替换为 EnumerateFiles(),将 Length 替换为 Count() (2认同)

小智 47

System.IO.Directory myDir = GetMyDirectoryForTheExample();
int count = myDir.GetFiles().Length;
Run Code Online (Sandbox Code Playgroud)

  • 要获得更节省资源的最新解决方案,请将 GetFiles() 替换为 EnumerateFiles(),将 Length 替换为 Count() (3认同)
  • 如果目录包含多个int.MaxValue文件,该怎么办? (2认同)

Dea*_*ean 21

最简单的方法是使用LINQ:

var fileCount = (from file in Directory.EnumerateFiles(@"H:\iPod_Control\Music", "*.mp3", SearchOption.AllDirectories)
                        select file).Count();
Run Code Online (Sandbox Code Playgroud)

  • 你可以写:var fileCount = Directory.EnumerateFiles(@"H:\ iPod_Control\Music","*.mp3",SearchOption.AllDirectories).Count(); (5认同)

Kri*_*ota 11

System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo("SourcePath");
int count = dir.GetFiles().Length;
Run Code Online (Sandbox Code Playgroud)

你可以用它.


det*_*ale 8

.NET 方法 Directory.GetFiles(dir) 或 DirectoryInfo.GetFiles() 对于仅获取文件总数来说不是很快。如果你非常频繁地使用这种文件计数方法,可以考虑直接使用WinAPI,这样可以节省大约50%的时间。

下面是 WinAPI 方法,我将 WinAPI 调用封装到 C# 方法:

int GetFileCount(string dir, bool includeSubdirectories = false)
Run Code Online (Sandbox Code Playgroud)

完整代码:

[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;
}
Run Code Online (Sandbox Code Playgroud)

当我在计算机上搜索包含 13000 个文件的文件夹时 - 平均:110 毫秒

int fileCount = GetFileCount(searchDir, true); // using WinAPI
Run Code Online (Sandbox Code Playgroud)

.NET 内置方法:Directory.GetFiles(dir) - 平均:230ms

int fileCount = Directory.GetFiles(searchDir, "*", SearchOption.AllDirectories).Length;
Run Code Online (Sandbox Code Playgroud)

注意:第一次运行这两种方法都会分别慢 60% - 100%,因为硬盘驱动器需要更长的时间来定位扇区。我猜后续的调用将被 Windows 半缓存。

  • 事实上,一项修复可能很重要。将此行:`if (findFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)`更改为:`if ((findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)`否则,具有任何附加属性的目录(假设设置了存档标志:32( 0x20)) 将被视为一个文件而不是被视为一个目录。参考:https://learn.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants (2认同)

Nal*_*ran 7

从目录中读取PDF文件:

var list = Directory.GetFiles(@"C:\ScanPDF", "*.pdf");
if (list.Length > 0)
{

}
Run Code Online (Sandbox Code Playgroud)