2010-05-10 31 views
8

Làm cách nào để nhận tổng số tệp trong một thư mục bằng cách sử dụng thư viện chuẩn C++? Bất kỳ trợ giúp nào được đánh giá cao.Số lượng tệp trong một thư mục bằng cách sử dụng C++

+1

Thao tác thư mục liên quan đến hệ điều hành bạn đang truy cập. Vì vậy, đăng bài với hệ điều hành bạn đang cố gắng, sau đó có lẽ chúng tôi có thể giúp bạn tốt hơn. – Daniel

+0

Mã nền tảng chéo để hoạt động trên cả Windows và Linux. Tôi đang sử dụng mingw, gcc và msvc cùng với thư viện wxWidgets, sử dụng tăng nhưng không liên kết đến thư viện của nó, chỉ bao gồm tiêu đề. chức năng fstat và _stat mà chúng tôi có trong #include . để nhận chi tiết tệp. Chúng tôi có hỗ trợ tương tự để nhận chi tiết thư mục không? – harik

Trả lời

11

Bạn không thể. Gần nhất bạn sẽ có thể nhận được là sử dụng một cái gì đó như Boost.Filesystem

+6

Sau đó nó tầm thường: 'int count = std :: sự khác biệt (directory_iterator (dir_path), directory_iterator());' – MSalters

+4

@MSalters, tôi không thể tìm thấy bất kỳ tham chiếu đến 'std :: difference'. Bạn có chắc chắn bạn không có nghĩa là 'std :: distance'? Ngoài ra, bạn sẽ cần 'static_cast ' để ép buộc 'directory_iterator :: difference_type' thành' int'. –

+0

Tôi đang cố gắng tránh liên kết tới thư viện Tăng cường và chỉ sử dụng tiêu đề cho thuật toán. – harik

2

Bạn sẽ cần sử dụng API hoặc khung gốc.

13

Nếu bạn không loại trừ thư viện chuẩn C luôn có sẵn, bạn có thể sử dụng thư viện đó. Bởi vì nó có sẵn ở khắp mọi nơi anyways, không giống như tăng, nó là một lựa chọn khá có thể sử dụng!

Ví dụ được đưa ra here.

Và ở đây:

#include <stdio.h> 
#include <sys/types.h> 
#include <dirent.h> 

int main (void) 
{ 
    DIR *dp; 
    int i; 
    struct dirent *ep;  
    dp = opendir ("./"); 

    if (dp != NULL) 
    { 
    while (ep = readdir (dp)) 
     i++; 

    (void) closedir (dp); 
    } 
    else 
    perror ("Couldn't open the directory"); 

    printf("There's %d files in the current directory.\n", i); 

    return 0; 
} 

Và đủ chắc chắn

> $ ls -a | wc -l 
138 
> $ ./count 
There's 138 files in the current directory. 

Đây không phải là C++ ở tất cả, nhưng nó có sẵn trên hầu hết, nếu không phải tất cả, hệ điều hành, và sẽ làm việc trong C++ bất kể.

CẬP NHẬT: Tôi sẽ sửa lại tuyên bố trước đây của tôi về việc này là một phần của thư viện chuẩn C - không phải. Nhưng bạn có thể mang khái niệm này đến các hệ điều hành khác, bởi vì tất cả chúng đều có cách xử lý các tệp mà không phải lấy ra các thư viện bổ sung.

+0

-1: Thư viện chuẩn C không cung cấp cách nào để liệt kê một thư mục. –

+5

Đó là một cuộc bỏ phiếu ngu xuẩn. Tất nhiên bạn có thể đếm các tập tin bằng cách sử dụng lib chuẩn C.Lấy ví dụ mà tôi đưa vào bài đăng của tôi - thay vì gọi "đặt ..." bên trong khi được sử dụng để lặp qua mọi tệp, chỉ cần thực hiện "i + +" và khai báo "int i" ở đâu đó ở trên. Tất nhiên là không có hàm "directory_get_file_count", nhưng đó không phải là vấn đề. Vấn đề là, bạn có thể sử dụng nó để có được kết quả mong muốn của bạn, cụ thể là số lượng tệp trong một thư mục. Các địa ngục, hãy để tôi chỉnh sửa câu trả lời ban đầu của tôi với một câu trả lời thìa ăn, sec – LukeN

+1

-1, 'readdir' là POSIX không tiêu chuẩn C. – MSalters

1

Nếu chúng được đặt tên, sắp xếp và có cùng phần mở rộng, bạn có thể chỉ cần đếm chúng với thư viện C++ chuẩn.

Giả sử tên tệp giống như "img_0.jpg..img_10000.jpg..img_n.jpg", Chỉ cần kiểm tra xem chúng có nằm trong thư mục hay không.

int Trainer::fileCounter(string dir, string prefix, string extension) 
{ 
    int returnedCount = 0; 
    int possibleMax = 5000000; //some number you can expect. 

    for (int istarter = 0; istarter < possibleMax; istarter++){ 
     string fileName = ""; 
     fileName.append(dir); 
     fileName.append(prefix); 
     fileName.append(to_string(istarter)); 
     fileName.append(extension); 
     bool status = FileExistenceCheck(fileName); 

     returnedCount = istarter; 

     if (!status) 
      break; 
    } 

    return returnedCount; 
} 

bool Trainer::FileExistenceCheck(const std::string& name) { 
    struct stat buffer; 
    return (stat(name.c_str(), &buffer) == 0); 
} 
6

Câu hỏi cũ, nhưng vì nó xuất hiện đầu tiên trên tìm kiếm của Google, tôi nghĩ thêm câu trả lời của mình vì tôi cần một thứ như thế.

int findNumberOfFilesInDirectory(std::string& path) 
{ 
    int counter = 0; 
    WIN32_FIND_DATA ffd; 
    HANDLE hFind = INVALID_HANDLE_VALUE; 

    // Start iterating over the files in the path directory. 
    hFind = ::FindFirstFileA (path.c_str(), &ffd); 
    if (hFind != INVALID_HANDLE_VALUE) 
    { 
     do // Managed to locate and create an handle to that folder. 
     { 
      counter++; 
     } while (::FindNextFile(hFind, &ffd) == TRUE); 
     ::FindClose(hFind); 
    } else { 
     printf("Failed to find path: %s", path.c_str()); 
    } 

    return counter; 
} 
Các vấn đề liên quan