Poco::DirectoryIterator

ディレクトリの内容物をイテレータで扱うための 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日からのダウンロード数:834

Subversion

・フリーの Subversion ホスティングサービス Assemblaで、ソースコードを管理しています。

Reference

POCO流ファイル処理あれこれ
http://pocoproject.org にある Files のプレセンテーション。(PDF)

Powered by POCO Copyright © 2010 Round Square Inc. All rights reserved.


Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>