• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:デスクトップ上の全ファイル取得)

デスクトップ上の全ファイル取得における問題と解決方法

このQ&Aのポイント
  • Windowsの特殊フォルダであるデスクトップ上の全ファイル取得において、正常な動作ができない問題が発生しています。
  • 現在のプログラムでは、SHGetFolderPath()で取得したデスクトップのパスを使用しているが、デスクトップフォルダ内にはデスクトップという名前のフォルダしか見つからない。
  • この問題を解決するためには、他の方法を探す必要がある。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★追記。 ・ソースを見たら再帰処理になっていなかったので書き直しました。 サンプル: #include <stdio.h> #include <shlwapi.h> #include <windows.h> // 再帰的にディレクトリを検索 VOID FuncListSubdir( LPTSTR lpPath ) {  // カウンタ変数  static TCHAR szLine[ 512 ];  static DWORD dwDeep = 0;  static DWORD dwFiles;  static DWORD dwSubdir;  // 宣言  WIN32_FIND_DATA fdFile;  HANDLE hFind;  LPTSTR lpWild;    // ディレクトリの表示  if ( dwDeep == 0 ){   printf( "★%s\n", lpPath );  }  else{   printf( "%s\n", szLine );   printf( "%.*s├◆%s\n", (lstrlen(szLine) - 2), szLine, PathFindFileName(lpPath) );  }  lpWild = PathAddBackslash( lpPath );  lstrcpy( lpWild, TEXT("*.*") );    if ( (hFind = FindFirstFile(lpPath,&fdFile)) != INVALID_HANDLE_VALUE ){   do {    if ( fdFile.cFileName[0] != '.' ){     if ( fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ){      lstrcpy( lpWild, fdFile.cFileName );      lstrcat( szLine, TEXT("│") );      dwDeep++;      FuncListSubdir( lpPath );      dwDeep--;      szLine[ lstrlen(szLine) - 2 ] = '\0';      dwSubdir++;     }     else{      printf( "%s├%s\n", szLine, fdFile.cFileName );      dwFiles++;     }    }   } while ( FindNextFile(hFind,&fdFile) );      FindClose( hFind );  }  lpWild[ -1 ] = '\0';    // 結果表示  if ( dwDeep == 0 ){   printf( "\n" );   printf( "全フォルダ数: %u 個\n", dwSubdir );   printf( "全ファイル数: %u 個\n", dwFiles );  } } // メイン関数 int main( int argc, char *argv[] ) {  TCHAR szPath[ MAX_PATH ];    if ( argc == 1 ){   printf( "USAGE: FindFirstFile.exe <direct>\n" );   return 1;  }  // 検索  lstrcpy( szPath, argv[1] );  FuncListSubdir( szPath );  return 0; } 以上。

kirishima8
質問者

お礼

回答ありがとうございます。 概ね何が悪いのか判ってきました。 どうやらFindFirstFileを使用した外部関数内でのパスの扱いで汎用的なコードを用いていなかったことが原因のようです。 ありがとうございました。

その他の回答 (1)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★最初に。 >これはWindowsの仕様の動作なのでしょうか。 >特殊フォルダであるデスクトップは、FindFirstFileでは調査出来ないのでしょうか? >他に方法はありますか?  ↑  特殊フォルダであっても SHGetFolderPath() 関数で取得したフルパスは実際に存在する  普通のディレクトリと同じです。なので同じように扱えます。 ・上手くいかなかったのはソースを見ないと分かりません。  次のリンクにソースを載せた過去があります。  http://oshiete1.goo.ne.jp/qa3220015.html→『あるディレクトリ内のファイルをファイル名でソートして取得』  ↑  このサンプルをコンソール・アプリケーションとして作成してコマンドラインから  デスクトップのパスをダブルクォーテーションで囲って試して見て下さい。  ※私の環境では普通のディレクトリと同じく検索表示されています。 ・以上。ソースなどを参考に。

参考URL:
http://oshiete1.goo.ne.jp/qa3220015.html

関連するQ&A