ディレクトリの内容物をイテレータで扱うための Poco::DirectoryIterator を紹介します。
DirectoryIteratorTest.cpp
・まず、表示するためのディレクトリとファイルを階層的に作成。
・ShowDirectoriesAndFiles() で Poco::DirectoryIterator を使い、ディレクトリの内容物を表示。
・ディレクトリの場合、ShowDirectoriesAndFiles() を再帰的に呼び出し。
#include <Poco/File.h> #include <Poco/Path.h> #include <Poco/Format.h> #include <Poco/Exception.h> #include <Poco/DirectoryIterator.h> #include <Poco/LocalDateTime.h> #include <Poco/DateTimeFormatter.h> #include <Poco/DateTimeFormat.h> #include <Poco/Timezone.h> #include <string> #include "ScopedLogMessage.h" #include "PrepareConsoleLogger.h" void ShowDirectoriesAndFiles(ScopedLogMessage& msg, const std::string& path) { Poco::DirectoryIterator dirItr(path); Poco::DirectoryIterator end; while(dirItr != end) { std::string attr(dirItr->isDirectory() ? "d":"-"); attr += dirItr->canRead() ? "r":"-"; attr += dirItr->canWrite() ? "w":"-"; Poco::LocalDateTime dateTime(dirItr->getLastModified()); msg.Message(Poco::format(" %s %s %s" , attr , Poco::DateTimeFormatter::format(dateTime, Poco::DateTimeFormat::SORTABLE_FORMAT) , dirItr->path())); if(dirItr->isDirectory()) { ShowDirectoriesAndFiles(msg, dirItr->path()); } ++dirItr; } } int main(int /*argc*/, char** /*argv*/) { PrepareConsoleLogger logger(Poco::Logger::ROOT, Poco::Message::PRIO_INFORMATION); ScopedLogMessage msg("DirectoryIteratorTest ", "start", "end"); msg.Message(""); msg.Message("--- create sample directories and files ---"); const char* dirNames[] = { "testDir1" , "testDir2" , "testDir3" }; const int kNumDir = sizeof(dirNames)/sizeof(dirNames[0]); const int kNumFilesInDir = 3; std::string nThPath[kNumDir]; for(int i=0; i<kNumDir; ++i) { for(int j=0; j<=i; ++j) { nThPath[i] += std::string(dirNames[j]) + Poco::Path::separator(); } Poco::File dir(Poco::Path(nThPath[i], Poco::Path::PATH_UNIX)); if(0 == i && dir.exists()) { try { dir.remove(true); msg.Message(Poco::format(" %s recursively removed", dir.path())); } catch(const Poco::Exception& exp) { msg.Message(Poco::format(" EXCEPTION [%s]", exp.displayText())); } } dir.createDirectories(); msg.Message(Poco::format(" %s created", dir.path())); for(int k=0; k<kNumFilesInDir; ++k) { Poco::File file(Poco::Path(dir.path(), Poco::format("testFile%d_%d.txt", i+1, k))); file.createFile(); msg.Message(Poco::format(" %s created", file.path())); } } msg.Message(""); msg.Message("--- show the directories and files by DirectoryIterator ---"); ShowDirectoriesAndFiles(msg, nThPath[0]); msg.Message(""); return 0; } |
Results of execution
[0] DirectoryIteratorTest start [0] [0] --- create sample directories and files --- [0] testDir1 created [0] testDir1/testFile1_0.txt created [0] testDir1/testFile1_1.txt created [0] testDir1/testFile1_2.txt created [0] testDir1/testDir2 created [0] testDir1/testDir2/testFile2_0.txt created [0] testDir1/testDir2/testFile2_1.txt created [0] testDir1/testDir2/testFile2_2.txt created [0] testDir1/testDir2/testDir3 created [0] testDir1/testDir2/testDir3/testFile3_0.txt created [0] testDir1/testDir2/testDir3/testFile3_1.txt created [0] testDir1/testDir2/testDir3/testFile3_2.txt created [0] [0] --- show the directories and files by DirectoryIterator --- [0] drw 2010-05-23 08:00:00 testDir1/testDir2 [0] drw 2010-05-23 08:00:00 testDir1/testDir2/testDir3 [0] -rw 2010-05-23 08:00:00 testDir1/testDir2/testDir3/testFile3_0.txt [0] -rw 2010-05-23 08:00:00 testDir1/testDir2/testDir3/testFile3_1.txt [0] -rw 2010-05-23 08:00:00 testDir1/testDir2/testDir3/testFile3_2.txt [0] -rw 2010-05-23 08:00:00 testDir1/testDir2/testFile2_0.txt [0] -rw 2010-05-23 08:00:00 testDir1/testDir2/testFile2_1.txt [0] -rw 2010-05-23 08:00:00 testDir1/testDir2/testFile2_2.txt [0] -rw 2010-05-23 08:00:00 testDir1/testFile1_0.txt [0] -rw 2010-05-23 08:00:00 testDir1/testFile1_1.txt [0] -rw 2010-05-23 08:00:00 testDir1/testFile1_2.txt [0] [0] DirectoryIteratorTest end |
Downloads
・ここをクリックすると、makefile や VC++ プロジェクトなど一式がダウンロードできます。
(2013.05.31 updated)
・2010年5月23日からのダウンロード数:1103
Subversion
・フリーの Subversion ホスティングサービス Assemblaで、ソースコードを管理しています。
Reference
・POCO流ファイル処理あれこれ
・http://pocoproject.org にある Files のプレセンテーション。(PDF)
![]() |
Copyright © 2010 Round Square Inc. All rights reserved. |
---|
0 Comments.