2008-12-08 76 views
11

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

14

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.

+0

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

+0

bạn có ý nghĩa gì với vanilla .NET? – Pacerier

+1

@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. –

1

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.

7

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

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

+2

điều này thật tuyệt – Pacerier

3

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 FindFirstFileFindNextFile 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á).

Các vấn đề liên quan