フォルダからのファイル数


80

C#でASP.NETを使用してフォルダーからファイル数を取得するにはどうすればよいですか?

回答:


58
System.IO.Directory myDir = GetMyDirectoryForTheExample();
int count = myDir.GetFiles().Length;

3
ディレクトリに複数のint.MaxValueファイルが含まれている場合の動作はどうなりますか?
Mel Gerats 2018

2
リソースを削減する最新のソリューションについては、GetFiles()をEnumerateFiles()に、LengthをCount()に置き換えてください
比較的

128

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;

「*」を使用してファイルを照合することをお勧めします。そうしないと、拡張子のないファイルはカウントに含まれません。
ニック・ブル

これには、サブフォルダーの数が含まれているようです。それは私が1つのサブフォルダとそうでない場合は、空のディレクトリにし、この戻り1.持っている、である
種類に新しいユーザーである

@MichaelPotterそれがdesktop.iniを数えていた可能性はありますか?
HeribertoLugo20年

リソースを削減する最新のソリューションについては、GetFiles()をEnumerateFiles()に、LengthをCount()に置き換えてください
比較的

22

最も巧妙な方法は、LINQを使用することです。

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

5
次のように書くことができます:var fileCount = Directory.EnumerateFiles(@ "H:\ iPod_Control \ Music"、 "* .mp3"、SearchOption.AllDirectories).Count();
AndrewS 2015

1
ファイルのコレクションが膨大な場合は、この方法をお勧めします。このアプローチはメモリを節約します。メソッドGetFilecreatestring []は、フラットなメモリスペースを必要としました。注意してください:)
hsd 2018年

15
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo("SourcePath");
int count = dir.GetFiles().Length;

これを使用できます。


8

ディレクトリからのPDFファイルの読み取り:

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

}

不必要にリストを定義します。これは、仕事をする必要があります。if Directory.Getfiles(@ "C:\ ScanPDF"、 "* .PDF")、カウント> 0。
ステファン・マイヤー

@StefanMeyerいいえ、後でそのリストを使用する場合は...
GuilleBauza20年

@GuilleBauza質問は、それらを使用して、PDFファイルをカウントしないことでした。)
ステファン・マイヤー

はい、でも使用しない場合のカウントのポイントは何
ですか

3

.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ファイルのフォルダーを検索する場合-平均:110ミリ秒

int fileCount = GetFileCount(searchDir, true); // using WinAPI

.NET組み込みメソッド:Directory.GetFiles(dir)-平均:230ms

int fileCount = Directory.GetFiles(searchDir, "*", SearchOption.AllDirectories).Length;

注:ハードドライブがセクターを見つけるのに少し時間がかかるため、いずれかの方法の最初の実行はそれぞれ60%〜100%遅くなります。後続の呼び出しは、Windowsによって半キャッシュされると思います。


すばらしい解決策ですが、それを機能させるには、次の編集をお勧めします。|||||||||||| public static long fileCount = 0を追加します。|||||||||||| // int fileCount = 0; //コメントアウト
マルクス

3
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

2

次のコードを試して、フォルダー内のファイルの数を取得してください

string strDocPath = Server.MapPath('Enter your path here'); 
int docCount = Directory.GetFiles(strDocPath, "*", 
SearchOption.TopDirectoryOnly).Length;



-1

LINQを使用して特定の型拡張の数を取得するには、次の簡単なコードを使用できます。

Dim exts() As String = {".docx", ".ppt", ".pdf"}

Dim query = (From f As FileInfo In directory.GetFiles()).Where(Function(f) exts.Contains(f.Extension.ToLower()))

Response.Write(query.Count())
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.