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
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.
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.
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
fajne to jest dobre – Pacerier
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).
- 1. Ile plików nagłówkowych znajduje się w standardzie C++?
- 2. Python - dowiedzieć się, ile obraz jest czarno
- 3. Jak dowiedzieć się, gdzie znajduje się katalog Python?
- 4. Wiedzieć, ile osób znajduje się na wideo
- 5. Jak mogę się dowiedzieć, na co wskazuje moje łącze symboliczne?
- 6. Rxj jak się dowiedzieć, ile widzą obserwujący nas subskrybenci?
- 7. Jak sprawdzić, ile opcji znajduje się w menu rozwijanym?
- 8. Co stanie się, jeśli w jednym katalogu w Linuxie znajduje się zbyt wiele plików?
- 9. Jak mogę się dowiedzieć, gdzie utworzono obiekt?
- 10. Jak mogę się dowiedzieć, kto nazwał SendMessage?
- 11. Uruchomiony skrypt bash jest zawieszony gdzieś. Czy mogę się dowiedzieć, na której linii się znajduje?
- 12. Jak mogę się dowiedzieć, ile pamięci jest fizycznie zainstalowane w systemie Windows?
- 13. Dynamicznie dowiedzieć się, ile wejść ma funkcja, Rakieta
- 14. Czy można dowiedzieć się, ile czasu spędził użytkownik na stronie?
- 15. Jak ustalić, czy ścieżka znajduje się wewnątrz katalogu? (POSIX)
- 16. Jak mogę dowiedzieć się, jak została wywołana kompilacja w Jenkins
- 17. Gdzie mogę się dowiedzieć o systemach rekomendacji?
- 18. Jak mogę dowiedzieć się, ile pamięci jest przydzielone do obiektu javascript?
- 19. Zastosowanie Foreman Start Rack App Znajduje się w innym katalogu
- 20. jak się dowiedzieć, ile preferencji współdzielonych w preferencjach współdzielonych w Androidzie
- 21. Gdzie mogę dowiedzieć się więcej o WebCoreSharedBufferData?
- 22. Gdzie mogę się dowiedzieć o MEF?
- 23. Jak dowiedzieć się, dlaczego Maven zawierał słoik?
- 24. Jak mogę się dowiedzieć, gdzie BufferedImage ma Alpha w Javie?
- 25. Jak mogę się dowiedzieć, w którym węźle działa proces erlang?
- 26. Jak mogę się dowiedzieć, która procedura spowodowała wyjątek w Delphi?
- 27. Jak mogę się dowiedzieć, kto jest wepchnięty w git?
- 28. Jak się dowiedzieć, czy UIkeyboard pojawił się w systemie iOS?
- 29. Dlaczego Django fcgi po prostu umrzeć? Jak mogę się dowiedzieć?
- 30. Czy skrypt Ruby może określić, w którym katalogu się znajduje?
Rzeczywiście, sam system plików nie utrzymuje liczby. Musi policzyć całą listę, aby znaleźć licznik - dlatego zajmuje to tyle samo czasu. – configurator
co masz na myśli przez wanilię .NET? – Pacerier
@Pacerier: Mam na myśli bez wykonywania wywołań P/Invoke do funkcji Win32. –