プロが教える店舗&オフィスのセキュリティ対策術

開発環境
WindowsXP,SP2
Visual Studio 2005
VC++ SDK

SHGetFolderPath()でデスクトップのパスを取得した後、FindFirstFileによってデスクトップ上の全ファイル及びディレクトリの名前を取得したいと考えております。
SHGetFolderPathで取得したパスは、
C:\Documents and Settings\...\デスクトップ
となっており、この文字列をwsprintfで次のように加工しました。
wsprintf(output,"%s\\*.*","C:\Documents and Settings\...\デスクトップ");
このoutputをFindFirstFile,FindNextFile,FindCloseを組み合わせたプログラムでディレクトリ内の全てのファイル及びディレクトリの名前を取得しています。

このプログラムは普通(?)のディレクトリでは有効で、こちらの期待通りの動きをしてくれるのですが、取得したデスクトップのパスを渡すと、デスクトップフォルダ内にはデスクトップという名前のフォルダしかないと出力されます。以下のような感じです。

調査ディレクトリ:C:\Documents and Settings\...\デスクトップ
調査結果
"C:\Documents and Settings\...\デスクトップ"ディレクトリ内のファイル及びディレクトリ:デスクトップ

これはWindowsの仕様の動作なのでしょうか。
特殊フォルダであるデスクトップは、FindFirstFileでは調査出来ないのでしょうか?
他に方法はありますか?

どうか教えてください。

A 回答 (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;
}
以上。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/06 00:10

★最初に。


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

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A