開発環境 |
Microsoft Visual C++ 2010 Express (SP1) |
実行環境 |
Microsoft Windows XP Home Edition (SP3) |
プロジェクトの種類 |
Win32 コンソール アプリケーション |
プロジェクト名 |
files2 |
アプリケーションの種類 |
コンソール アプリケーション |
追加のオプション |
空のプロジェクト |
文字セット |
Unicode |
files2.c
#include <fcntl.h> // _O_WTEXT
#include <io.h> // _setmode
#include <stdio.h> // _fileno
#include <stdlib.h>
#include <tchar.h>
int files(const _TCHAR *ptcDir);
int _tmain()
{
_TCHAR atcDir[_MAX_PATH];
size_t size;
// BOMなしUTF-16LE
_setmode(_fileno(stdout), _O_WTEXT);
_setmode(_fileno(stderr), _O_WTEXT);
_tgetcwd(atcDir, _countof(atcDir));
size = _tcslen(atcDir);
if (0 < size && atcDir[size - 1] != _T('\\')) {
_tcscat_s(atcDir, _countof(atcDir), _T("\\"));
}
files(atcDir);
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, _countof(atcPath), _T("%s*.*"), ptcDir);
handle = _tfindfirst(atcPath, &fi);
if (handle == -1) {
_ftprintf(stderr, _T("error: _tfindfirst[%s]\n"), ptcDir);
return -1;
}
do {
if (fi.attrib & _A_SUBDIR) {
if (!_tcscmp(fi.name, _T(".")) || !_tcscmp(fi.name, _T(".."))) {
continue;
}
if (_MAX_PATH <= sizeDir + _tcslen(fi.name) + 1) {
_ftprintf(stderr, _T("error: パスが長過ぎます。[%s][%s]\n"),
ptcDir, fi.name);
continue;
}
_stprintf_s(atcPath, _countof(atcPath), _T("%s%s\\"), ptcDir, fi.name);
files(atcPath);
} else {
_tprintf(_T("%10u %s%s\n"), fi.size, ptcDir, fi.name);
}
} while (_tfindnext(handle, &fi) == 0);
_findclose(handle);
return 0;
}
最終更新:2012年08月31日 11:21