2008-12-08 37 views
11

Potrzebuję uzyskać liczbę plików w katalogu. Mogłabym uzyskać nazwy wszystkich plików w katalogu przy użyciu System.IO.Directory.GetFiles() i wziąć długość tej tablicy, ale to zajmuje zbyt długo na dużych katalogach. Czy istnieje sposób na uzyskanie tylko liczby bez konieczności uzyskiwania imion?Jak mogę się dowiedzieć, ile plików znajduje się w katalogu?

Odpowiedz

14

Nie wierzę tak, nie - przynajmniej nie w wanilii .NET. Podejrzewam, że to nie jest faktyczne pobieranie nazw, które zabiera czas - to system operacyjny przechodzi przez katalogi. Tam może być wywołanie Win32 można dokonać za pośrednictwem P/Invoke.

Jak duży jest katalog, na który patrzysz? Ogólnie jest to co najmniej tradycyjnie nie był dobrym pomysłem, aby mieć więcej niż kilkaset plików w katalogu. Ogólnie systemy plików uległy poprawie, ale nie wiem, jaki jest obecny stan w przypadku NTFS i Fat32.

+0

Rzeczywiście, sam system plików nie utrzymuje liczby. Musi policzyć całą listę, aby znaleźć licznik - dlatego zajmuje to tyle samo czasu. – configurator

+0

co masz na myśli przez wanilię .NET? – Pacerier

+1

@Pacerier: Mam na myśli bez wykonywania wywołań P/Invoke do funkcji Win32. –

1

Do tej pory w większości języków, z którymi się spotkałem, informacje te są dostępne tylko po przejściu przez folder i zliczeniu plików. Wątpię, aby było wywołanie interfejsu Windows API, aby uzyskać tylko liczbę (ale mogę być zaskoczony!).
zaletą metody: elastyczność - można odfiltrować niektórych typów plików, schodzić rekurencyjnie lub zignorować foldery itp

Jeśli metoda jest powolny dla ciebie, może powinieneś dostać lepszą metodę, jak nie stworzenie tablica wypełniona informacją o katalogu (potrzeba czasu, aby ją wypełnić, nie mówiąc już o koszcie pamięci i czasie zbierania śmieci), ale za pomocą iteratora: trochę więcej pracy (ale gdy już uzyskasz funkcję, zawsze jest tam), ale o wiele bardziej wydajna.

7

zrobiłem mały test - napisał to samo zadanie w C++/Qt i C++/CLI:

LARGE_INTEGER i1, i2;  

QueryPerformanceCounter(&i1);  

int count = IO::Directory::GetFiles(L"c:\\windows\\system32")->Length; 

QueryPerformanceCounter(&i2); 

__int64 result = i2.QuadPart - i1.QuadPart; 

Wynik jest o 16.500.000

i

LARGE_INTEGER i1, i2; 

QueryPerformanceCounter(&i1); 

intcount = QDir("c:/windows/system32").entryList(QDir::Files).count(); 

QueryPerformanceCounter(&i2); 

__int64 result += i2.QuadPart - i1.QuadPart; 

Wynik około 2.100.000.000

Liczba plików jest 2125

+2

fajne to jest dobre – Pacerier

3

Nie ma szybszej metody. Bez względu na to, czego używasz, wszystko sprowadza się do wywołań Win32 FindFirstFile i FindNextFile.
Możesz spróbować użyć czegoś takiego jak this, ale zajmie to prawdopodobnie tyle samo czasu - ale może przy odrobinie mniejszym zużyciu pamięci (= prawdopodobnie nie warto).

Powiązane problemy