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