下記のディレクトリ検索では、指定したディレクトリ内のフォルダを検索することが出来ず、グローバル変数でディレクトリ指定とファイル指定を行っていますが
ディレクトリ指定とファイル指定をプロンプト上で行うためには、このソースをどのように変形すれば良いでしょうか?
/*ディレクトリ検索(win32 コンソール) 再帰呼び出し処理*/
// インクルードヘッダ
#include <windows.h>
#include <stdio.h>
// 定数宣言
#define MAX_STRING 1025 // 文字列最大数
// 関数プロトタイプ
VOID GetDir(LPCTSTR fld, LPCTSTR wcd);
VOID FileJob(LPCTSTR fld, LPCTSTR wcd, LPCTSTR fnm, DWORD atr);
VOID DirJob(LPCTSTR fld, LPCTSTR wcd, LPCTSTR fnm, DWORD atr);
// グローバル変数
TCHAR fld[MAX_STRING] = "c:\\実験\\"; // 検索ディレクトリ
TCHAR wcd[MAX_STRING] = "*.txt"; // 検索ワイルドカード
TCHAR log[MAX_STRING] = "c:\\実験\\filelist.txt"; // リスト出力ファイル
HANDLE fno; // リスト出力ハンドル
/*
========================================================================
メイン
========================================================================
*/
int main(int argc, char **argv)
{
int i;
// パラメタ取得
for (i = 1; i < argc; i++) {
switch (i) {
case 1:
lstrcpy(fld, argv[i]); // 開始フォルダ
break;
case 2:
lstrcpy(wcd, argv[i]); // ワイルドカード
break;
case 3:
lstrcpy(log, argv[i]); // リスト出力ファイル
break;
}
}
// 処理開始
printf("ディレクトリ検索開始...\n");
// ファイルリスト出力用ファイルオープン
if ((fno = CreateFile(log, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) return -1;
// ディレクトリ検索開始
GetDir(fld, wcd);
// ファイルリスト出力用ファイルクローズ
CloseHandle(fno);
// 処理終了
printf("\nディレクトリ検索終了。\n");
return 0;
}
/*
========================================================================
ディレクトリ取得
========================================================================
*/
VOID GetDir(LPCTSTR fld, LPCTSTR wcd)
{
HANDLE dno;
TCHAR dir[MAX_STRING];
WIN32_FIND_DATA fil;
// ファイル検索条件合成
lstrcat(lstrcpy(dir, fld), wcd);
// ファイル検索
if ((dno = FindFirstFile(dir, &fil)) != INVALID_HANDLE_VALUE) {
if ((fil.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) {
FileJob(fld, wcd, fil.cFileName, fil.dwFileAttributes);
}
while(FindNextFile(dno, &fil) != 0) {
if ((fil.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) {
FileJob(fld, wcd, fil.cFileName, fil.dwFileAttributes);
}
}
FindClose(dno);
}
// ディレクトリ検索条件合成
lstrcat(lstrcpy(dir, fld), "*");
// ディレクトリ検索
if ((dno = FindFirstFile(dir, &fil)) == INVALID_HANDLE_VALUE) return;
if ((fil.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) {
DirJob(fld, wcd, fil.cFileName, fil.dwFileAttributes);
}
while(FindNextFile(dno, &fil) != 0) {
if ((fil.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) {
DirJob(fld, wcd, fil.cFileName, fil.dwFileAttributes);
}
}
FindClose(dno);
// リターン
return;
}
/*
========================================================================
ファイル処理
========================================================================
*/
VOID FileJob(LPCTSTR fld, LPCTSTR wcd, LPCTSTR fnm, DWORD atr)
{
TCHAR fil[MAX_STRING];
TCHAR rec[MAX_STRING];
DWORD rlen;
// ファイルフルパス合成
lstrcat(lstrcpy(fil, fld), fnm);
// ファイル処理
printf("ファイル名: %s - %d\n", fil, atr);
wsprintf(rec, "ファイル名: %s - %d\n", fil, atr);
WriteFile(fno, rec, lstrlen(rec), &rlen, NULL);
// リターン
return;
}
/*
========================================================================
ディレクトリ処理
========================================================================
*/
VOID DirJob(LPCTSTR fld, LPCTSTR wcd, LPCTSTR fnm, DWORD atr)
{
TCHAR dir[MAX_STRING];
// カレント、親ディレクトリスキップ
if (strcmp(fnm, ".") == 0 || strcmp(fnm, "..") == 0) return;
// ディレクトリフルパス合成
lstrcat(lstrcat(lstrcpy(dir, fld), fnm), "\\");
// ディレクトリ処理
//printf("フォルダ名: %s - %d\n", dir, atr);
printf(".");
// サブディレクトリ再帰処理
GetDir(dir, wcd);
// リターン
return;
}
> lstrcat(lstrcpy(dir, fld), wcd);
一体これは何をしようとしているの?
TCHAR buff[MAX_STRING * 2 + 1] = {0};
::wsprintf(dir, "%s%s", fld, wcd);
> lstrcat(lstrcpy(dir, fld), "*");
これも、
::wsprintf(dir, "%s*", fld);
それ以前の問題もあるが、、、もう遅いので、誰かに譲りますヽ(´ー`)ノ