- ベストアンサー
デスクトップ上の全ファイル取得における問題と解決方法
- Windowsの特殊フォルダであるデスクトップ上の全ファイル取得において、正常な動作ができない問題が発生しています。
- 現在のプログラムでは、SHGetFolderPath()で取得したデスクトップのパスを使用しているが、デスクトップフォルダ内にはデスクトップという名前のフォルダしか見つからない。
- この問題を解決するためには、他の方法を探す必要がある。
- みんなの回答 (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; } 以上。
その他の回答 (1)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★最初に。 >これはWindowsの仕様の動作なのでしょうか。 >特殊フォルダであるデスクトップは、FindFirstFileでは調査出来ないのでしょうか? >他に方法はありますか? ↑ 特殊フォルダであっても SHGetFolderPath() 関数で取得したフルパスは実際に存在する 普通のディレクトリと同じです。なので同じように扱えます。 ・上手くいかなかったのはソースを見ないと分かりません。 次のリンクにソースを載せた過去があります。 http://oshiete1.goo.ne.jp/qa3220015.html→『あるディレクトリ内のファイルをファイル名でソートして取得』 ↑ このサンプルをコンソール・アプリケーションとして作成してコマンドラインから デスクトップのパスをダブルクォーテーションで囲って試して見て下さい。 ※私の環境では普通のディレクトリと同じく検索表示されています。 ・以上。ソースなどを参考に。
お礼
回答ありがとうございます。 概ね何が悪いのか判ってきました。 どうやらFindFirstFileを使用した外部関数内でのパスの扱いで汎用的なコードを用いていなかったことが原因のようです。 ありがとうございました。