開発環境 |
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