Tôi cần đếm số lượng tệp trong một thư mục. Tôi có thể lấy tên của tất cả các tệp trong thư mục bằng cách sử dụng System.IO.Directory.GetFiles()
và mất độ dài của mảng đó nhưng quá lâu trên các thư mục lớn. Có cách nào để lấy số lượng mà không cần phải lấy tên không?Làm cách nào để biết có bao nhiêu tệp trong một thư mục?
Trả lời
Tôi không tin như vậy, không - ít nhất không có trong vani .NET. Tôi nghi ngờ nó không phải là thực tế lấy tên của các tên mà mất thời gian - đó là hệ điều hành đi bộ qua các thư mục internals. Có có thể là cuộc gọi Win32 mà bạn có thể thực hiện qua P/Gọi.
Thư mục bạn đang xem bao nhiêu? Nói chung ít nhất theo truyền thống không phải là ý tưởng hay khi có nhiều hơn một vài trăm tệp trong một thư mục. Hệ thống tập tin đã được cải thiện ở đây nói chung, nhưng tôi không biết trạng thái hiện tại là với NTFS và Fat32.
Cho đến giờ, trong hầu hết các ngôn ngữ tôi gặp phải, bạn chỉ nhận được thông tin này bằng cách đi bộ thư mục và đếm các tệp. Tôi nghi ngờ có một cuộc gọi Windows API để có được chỉ đếm (nhưng tôi có thể ngạc nhiên!).
Advantage của phương pháp này: linh hoạt - bạn có thể lọc ra một số loại tập tin, đi bộ xuống một cách đệ quy hoặc bỏ qua các thư mục vv
Nếu phương pháp này là chậm đối với bạn, có thể bạn sẽ nhận được một phương pháp tốt hơn, như không tạo ra một mảng đầy thông tin thư mục (mất thời gian để điền vào nó! không kể đến chi phí bộ nhớ và thời gian thu gom rác) nhưng sử dụng một trình lặp: công việc nhiều hơn một chút (nhưng một khi bạn nhận được hàm, nó luôn ở đó) nhưng hiệu quả hơn nhiều.
tôi đã làm một thử nghiệm nhỏ - viết cùng một công việc trong C++/Qt và 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;
Kết quả là khoảng 16.500.000
và
LARGE_INTEGER i1, i2;
QueryPerformanceCounter(&i1);
intcount = QDir("c:/windows/system32").entryList(QDir::Files).count();
QueryPerformanceCounter(&i2);
__int64 result += i2.QuadPart - i1.QuadPart;
Kết quả là khoảng 2.100.000.000
Số lượng tệp là 2125
điều này thật tuyệt – Pacerier
Không có cách nào nhanh hơn. Không có vấn đề gì bạn sử dụng, tất cả sẽ được giảm xuống còn FindFirstFile
và FindNextFile
các cuộc gọi Win32.
Bạn có thể thử sử dụng một cái gì đó như this, nhưng nó có thể sẽ mất nhiều thời gian - nhưng có thể với một chút ít sử dụng bộ nhớ (= có lẽ không đáng giá).
- 1. Có bao nhiêu tệp trong một thư mục quá nhiều (trên Windows và Linux)?
- 2. tệp zip python, làm cách nào để biết một mục là một thư mục?
- 3. Có cách nào để biết có bao nhiêu thông số cần thiết cho một phương pháp?
- 4. Khung của tôi nên có bao nhiêu thư mục?
- 5. Làm cách nào để biết/thay đổi thư mục hiện tại trong trình bao Python?
- 6. Làm thế nào để biết bao nhiêu thời gian bằng cách "đồng bộ" mã, trong Java?
- 7. Làm thế nào để biết có bao nhiêu người nghe sự kiện có trên trang
- 8. clojure làm thế nào để biết đường dẫn của một thư mục/tập tin/thư mục trong một dự án?
- 9. Làm cách nào để có được kích thước thư mục (tệp trong thư mục) trong C#?
- 10. JQuery: Làm thế nào để biết được có bao nhiêu phần tử con?
- 11. Trong mục tiêu-C, làm thế nào để + phân bổ biết bao nhiêu bộ nhớ để phân bổ?
- 12. Làm thế nào để bao gồm cấu trúc thư mục trong một tệp jar kiến?
- 13. Làm thế nào để khởi tạo một ByteBuffer nếu bạn không biết có bao nhiêu byte để phân bổ trước?
- 14. Biết có bao nhiêu người đang xem video
- 15. Có cách nào để biết đối tượng nào và tôi có bao nhiêu bộ nhớ trong bộ nhớ?
- 16. Làm cách nào để bao gồm một thư mục trống trong một cụm maven?
- 17. Làm cách nào để biết một SPListItem là một tài liệu hay một thư mục
- 18. Làm thế nào để miễn phí() biết bao nhiêu bộ nhớ để deallocate?
- 19. Android, làm cách nào để có danh sách tất cả các tệp trong một thư mục?
- 20. Làm cách nào tôi có thể truy xuất hiệu quả số lượng tệp trong một thư mục?
- 21. Các scon có biết trong thư mục nào có tệp SConscript không?
- 22. Tôi làm cách nào để tìm kiếm tệp Eclipse không bao gồm thư mục svn?
- 23. Làm cách nào để tìm tệp trong mỗi thư mục có số lượng tệp cao nhất?
- 24. Có một lệnh trình bao để đệ quy cho phép các thư mục và tệp không?
- 25. Có bao nhiêu mục mà ListView có thể lưu trữ?
- 26. Tập lệnh Ruby có thể cho biết thư mục đó nằm trong thư mục nào không?
- 27. Có bao nhiêu tệp tiêu đề trong tiêu chuẩn C++?
- 28. Nút trong GridView: Làm cách nào để biết Mục nào?
- 29. Có bao nhiêu LINQ?
- 30. Làm cách nào để xóa các tệp trong thư mục được sao chép từ một thư mục khác?
Thật vậy, bản thân hệ thống tệp không giữ số. Nó phải đếm toàn bộ danh sách để tìm số lượng - đó là lý do tại sao phải mất cùng một lượng thời gian. – configurator
bạn có ý nghĩa gì với vanilla .NET? – Pacerier
@Pacerier: Tôi có nghĩa là không thực hiện P/Gọi các cuộc gọi đến một chức năng Win32. –