Liczba plików z folderu

80

Jak uzyskać liczbę plików z folderu przy użyciu programu ASP.NET w języku C #?

Sreejesh Kumar
źródło

Odpowiedzi:

58
System.IO.Directory myDir = GetMyDirectoryForTheExample();
int count = myDir.GetFiles().Length;
X4lldux
źródło
3
Jakie jest zachowanie, jeśli katalog zawiera więcej plików niż int.MaxValue?
Mel Gerats
2
Aby uzyskać bardziej aktualne rozwiązanie, które jest lżejsze pod względem zasobów, zastąp GetFiles () przez EnumerateFiles () i Length według Count ()
stosunkowo_random
128

Możesz użyć metody Directory.GetFiles

Zobacz także Directory.GetFiles Method (String, String, SearchOption)

Możesz określić opcję wyszukiwania w tym przeciążeniu.

TopDirectoryOnly : uwzględnia tylko bieżący katalog w wyszukiwaniu.

AllDirectories : obejmuje bieżący katalog i wszystkie podkatalogi w operacji wyszukiwania. Ta opcja obejmuje punkty ponownej analizy, takie jak zamontowane dyski i dowiązania symboliczne w wyszukiwaniu.

// 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;
rahul
źródło
Czy mogę zasugerować użycie znaku „*” do dopasowania plików, w przeciwnym razie pliki bez rozszerzeń nie zostaną uwzględnione w liczbie.
Nick Bull
Wydaje się, że obejmuje to liczbę podfolderów. Oznacza to, że mam jeden podfolder oraz w inny sposób pustego katalogu i to zwraca 1.
Bądź miły dla nowych użytkowników
@MichaelPotter czy to możliwe, że liczył desktop.ini?
Heriberto Lugo
Aby uzyskać bardziej aktualne rozwiązanie, które jest lżejsze pod względem zasobów, zastąp GetFiles () przez EnumerateFiles () i Length według Count ()
stosunkowo_random
22

Najsprytniejszą metodą byłoby użycie LINQ :

var fileCount = (from file in Directory.EnumerateFiles(@"H:\iPod_Control\Music", "*.mp3", SearchOption.AllDirectories)
                        select file).Count();
Dziekan
źródło
5
Możesz po prostu napisać: var fileCount = Directory.EnumerateFiles (@ "H: \ iPod_Control \ Music", "* .mp3", SearchOption.AllDirectories) .Count ();
AndrewS,
1
Polecam tę metodę w przypadku dużych zbiorów plików. Takie podejście oszczędza pamięć. Metoda GetFiletworzy string [], który wymaga płaskiej przestrzeni pamięci. Uważaj :)
hsd
15
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo("SourcePath");
int count = dir.GetFiles().Length;

Możesz tego użyć.

Krishna Thota
źródło
8

Czytanie plików PDF z katalogu:

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

}
Nalan Madheswaran
źródło
Niepotrzebne definiowanie listy. To powinno wystarczyć: jeśli Directory.Getfiles (@ "C: \ ScanPDF", "* .pdf"). Count> 0
Stefan Meyer
@StefanMeyer Nie, jeśli będziemy używać tej listy później ...
Guille Bauza
@GuilleBauza Pytanie polegało na policzeniu plików PDF, a nie ich wykorzystaniu;)
Stefan Meyer
Tak, ale po co liczyć, jeśli go nie użyjesz ...
Guille Bauza
3

Metody .NET Directory.GetFiles (dir) lub DirectoryInfo.GetFiles () nie są zbyt szybkie, jeśli chodzi o po prostu uzyskanie całkowitej liczby plików. Jeśli bardzo intensywnie korzystasz z tej metody liczenia plików, rozważ bezpośrednie użycie WinAPI , co oszczędza około 50% czasu.

Oto podejście WinAPI, w którym hermetyzuję wywołania WinAPI do metody C #:

int GetFileCount(string dir, bool includeSubdirectories = false)

Kompletny kod:

[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;
}

Podczas wyszukiwania w folderze z 13000 plików na moim komputerze - średnio: 110 ms

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

Wbudowana metoda .NET: Directory.GetFiles (dir) - średnia: 230 ms

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

Uwaga: pierwsze uruchomienie którejkolwiek z metod będzie odpowiednio o 60% - 100% wolniejsze, ponieważ lokalizacja sektorów zajmuje dysk twardy nieco dłużej. Przypuszczam, że kolejne wywołania będą buforowane częściowo przez system Windows.

detale
źródło
Świetne rozwiązanie, ale aby wszystko działało, polecam następującą edycję: |||||||||||| dodaj public static long fileCount = 0; |||||||||||| // int fileCount = 0; // skomentuj
Markus,
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
Varun
źródło
2

Spróbuj wykonać poniższy kod, aby uzyskać liczbę plików w folderze

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

anagha
źródło
2
int filesCount = Directory.EnumerateFiles(Directory).Count();
Josue Martinez
źródło
-1

Aby uzyskać liczbę niektórych rozszerzeń typu przy użyciu LINQ, możesz użyć tego prostego kodu:

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())
Wessam El Mahdy
źródło