開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 コンソール アプリケーション
プロジェクト名 files3
アプリケーションの種類 コンソール アプリケーション
追加のオプション 空のプロジェクト
文字セット Unicode

files3.cpp
#include <fcntl.h>	// _O_WTEXT
#include <io.h>		// _setmode
#include <tchar.h>
#include <map>
#include <string>
 
// 型定義
typedef unsigned long u_long;
typedef std::multimap<u_long,std::wstring> mmulws;
 
// 関数プロトタイプ宣言
int files(const _TCHAR *ptcDir);
 
// グローバル変数
mmulws g_mmap;
 
//==============================================================================
int _tmain(int argc, _TCHAR *argv[])
{
	mmulws::iterator it;
	_TCHAR atcDir[_MAX_PATH];
	size_t size;
 
	// BOMなしUTF-16LE
	_setmode(_fileno(stdout), _O_WTEXT);
	_setmode(_fileno(stderr), _O_WTEXT);
 
	if (argc != 2) {
		_ftprintf(stderr, _T("usage: files3 dir\n"));
		return 1;
	}
	_tcscpy_s(atcDir, argv[1]);
	size = _tcslen(atcDir);
	if (0 < size && atcDir[size - 1] == _T('\\')) {
		atcDir[size - 1] = _T('\0');
	}
	files(atcDir);
	for (it = g_mmap.begin(); it != g_mmap.end(); it++) {
		_tprintf(_T("%10u %s\n"), it->first, it->second.c_str());
	}
	return 0;
}
 
//------------------------------------------------------------------------------
int files(const _TCHAR *ptcDir)
{
	struct _wfinddata_t fi;	// fileinfo
	_TCHAR atcPath[_MAX_PATH];
	intptr_t handle;
	size_t sizeDir;
 
	sizeDir = _tcslen(ptcDir);
	if (_MAX_PATH <= sizeDir + 4) {
		_ftprintf(stderr, _T("error: パスが長過ぎます。%d[%s]\n"), sizeDir, ptcDir);
		return -1;
	}
	_stprintf_s(atcPath, _T("%s\\*.*"), ptcDir);
	handle = _tfindfirst(atcPath, &fi);
	if (handle == -1) {
		_ftprintf(stderr, _T("error: _tfindfirst[%s]\n"), ptcDir);
		return -1;
	}
	do {
		if (_MAX_PATH <= sizeDir + 1 + _tcslen(fi.name)) {
			_ftprintf(stderr, _T("error: パスが長過ぎます。[%s][%s]\n"),
				ptcDir, fi.name);
			continue;
		}
		_stprintf_s(atcPath, _T("%s\\%s"), ptcDir, fi.name);
		if (fi.attrib & _A_SUBDIR) {
			if (!_tcscmp(fi.name, _T(".")) || !_tcscmp(fi.name, _T(".."))) {
				continue;
			}
			files(atcPath);
		} else {
			g_mmap.insert(mmulws::value_type(fi.size, atcPath));
		}
	} while (_tfindnext(handle, &fi) == 0);
	_findclose(handle);
	return 0;
}
 
最終更新:2012年08月31日 11:21