Duyệt các file trong một thư mục với C++ sử dụng thư viện boost

Khi lập trình C++ thao tác với file/thư mục; một yêu cầu thường gặp là duyệt tất cả các file trong một thư mục. Các hàm xử lý thư mục không phải là hàm chuẩn trong C++, và thư viện STL cũng không có các hàm này. Trên các platform khác nhau lại có các hàm xử lý khác nhau. Điều này gây khó khăn khi chuyển từ platform này sang platform kia, ta lại phải làm lại.

Bài viết ghi chép lại cách sử dụng bộ thư viện boost cho C++ để thực hiện việc duyệt các file trong một thư viện (tổng hợp từ nhiều nguồn trên NET).

boost C++ là bộ thư viện mã nguồn mở, extend các chức năng của bộ thư viện sẵn có của C++, cho phép khả năng khả chuyển trên nhiều platform. Để sử dụng boost, trước tiên cần cài bộ thư viện này. Download tại: http://www.boost.org/

Tham khảo các tài liệu về bộ thư viện này tại: http://en.highscore.de/cpp/boost/http://shoddykid.blogspot.com/2008/07/getting-started-with-boost.html

Để duyệt các file trong một thư mục, tôi sử dụng lớp Boost Filesystem và các hàm trong lớp đó.

Đoạn chương trình sau đây minh họa cách sử dụng lớp Filesystem để duyệt các file trong một thư mục.


#include <iostream>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/fstream.hpp>

using namespace std;

/**
* List all files in the directory
* @param dirname
*/
void directoryListing(const string& dirname) {
  // Tạo full path cho thư mục dirname
  boost::filesystem::path dirpath(dirname, boost::filesystem::native);

  // Kiểm tra xem thư mục có tồn tại
  if (!boost::filesystem::exists(dirpath)) {
    cerr << "Directory: " << dirname << " does not exist!" << endl;
    return;
  }
  if (!boost::filesystem::is_directory(dirpath)) {
    cerr << dirpath.string() << " is not a directory!" << endl;
    return;
  }

  // Khai báo iterator để duyệt thư mục
  boost::filesystem::directory_iterator end_itr;

  for (boost::filesystem::directory_iterator itr(dirpath); itr != end_itr; itr++) {
    string filename = itr->leaf(); // Tên file hiện tại
    cout << filename; //
    if (boost::filesystem::is_directory(*itr)) {
      cout << " (dir)"; // Nếu là thư mục in ra (dir)
    }
    cout << "\n";
  }
}

Khi duyệt file, ngoài việc in ra tên file/thư mục, có thể chèn các dòng code xử lý file tùy ý. Chú ý khi dịch bạn cần chỉ rõ đường dẫn tới các header files và thư viện boost (dùng tùy chọn -I và -L khi biên dịch).

Leave a comment