ディレクトリ検索でフォルダもファイルも両方フルパスで表記するには?


ペンた君  2003-09-02 17:39:25  No: 52065  IP: [192.*.*.*]

下記のディレクトリ検索では、指定したディレクトリ内のフォルダを検索することが出来ず、グローバル変数でディレクトリ指定とファイル指定を行っていますが
ディレクトリ指定とファイル指定をプロンプト上で行うためには、このソースをどのように変形すれば良いでしょうか?
/*ディレクトリ検索(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;
}

編集 削除
RAPT  2003-09-02 23:38:35  No: 52066  IP: [192.*.*.*]

> 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);

それ以前の問題もあるが、、、もう遅いので、誰かに譲りますヽ(´ー`)ノ

編集 削除