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

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

デスクトップ上の全ファイル取得

開発環境 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では調査出来ないのでしょうか? 他に方法はありますか? どうか教えてください。

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

  • ベストアンサー
  • 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

  • [Active Basic]デスクトップのパスを取得

    Active Basicでデスクトップへのファイルパスを取得するための方法を教えていただきたいのですが・・・・ C:\Documents and Settings~っといった感じの絶対パス(?)で取得する方法を知りたいです。 どなたか知っている方、いらっしゃいましたらご教授ください。 お願いします。

  • DOSのバッチファイルでカレントフォルダを取得するには?

    現在バッチファイルにファイルをドラッグ&ドロップするとそのファイルを処理するようなバッチを組もうとしています。 おおまかな流れとして  1.ファイルのバックアップ  2.test.exeの引数にファイルのパスを渡す といった事をしたいのですが、バッチファイルにドラッグ&ドロップするとカレントフォルダがC:\Documents and Settings\user\になってしまいます。 バッチファイルのある場所をカレントフォルダとするにはどうすればよいのでしょうか。 以下カレントフォルダを確認した結果です。 OS:Windows2000 実行バッチのパス: C:\Documents and Settings\user\デスクトップ\test.bat ---test.bat---- @echo off cd pause test.bat直接起動 C:\Documents and Settings\user\デスクトップ test.batにファイルをD&D C:\Documents and Settings\user 伝わりづらくて申し訳ございません。 宜しくお願い致します。

  • アプリケーションのあるファイル名を取得

    VBプログラミングをしているのですが、 その本体がある場所のファイル名を取得したいのですが、なにかよい方法はあるでしょうか? たとえば 本体.exeまでのフルパスが C:\Documents and Settings\Administrator\My Documents\ファイルA\本体.exe としたら C:\Documents and Settings\Administrator\My Documents\ファイルA までを取得したいのです。 世ろ紙お願いいたします。

  • SHGetPathFromIDList によるパス取得

    IShellFolder によって、ある LPCITEMIDLIST から SHGetPathFromIDList を利用してパスを取得しようとしているのですが、意図したパス情報が返されないので困っています。 詳細 SHBrowseForFolder で呼び出せるフォルダ選択ダイアログのような フォルダ選択画面を作成しています(諸事情がありフォルダ選択ダイアログが使えません)。 そこで次のサイト http://hp.vector.co.jp/authors/VA016117/winsdk.html を参考に、ユーザーが選択したフォルダのパスをSHGetPathFromIDList を呼び出して取得しようとしているのですが、なぜか例えば "D:\test" は "C:\Documents And Setting\user_name\デスクトップ\test" として返されるため、次の段階のディレクトリのオープン処理(FindFirstFile)に失敗してしまいます。 SHBrowseForFolder のようにドライブレターから始まるパスを取得するにはどうすればいいのでしょうか。

  • リンク切れのデスクトップアイコンを削除できない

    デスクトップPC、WinXP-SP3です。 元々Cドライブにあった「デスクトップ」をDドライブに変更すべく、「C:\Documents and Settings\All Users\デスクトップ」というフォルダをDドライブのルートディレクトリに移動しました。 その後、「デスクトップ」という名のフォルダが、「C:\Documents and Settings\ユーザ名」や「C:\Documents and Settings\Default User」などにもあることが分かり、デスクトップフォルダを相互に移動上書きしたり、フォルダ内のショートカットを削除なりした結果、デスクトップ画面に削除できないアイコンがいくつか残ってしまいました。削除しようとしても「ファイルを削除できません。送り側のファイル又はディスクから読み取れません。」というエラーメッセージが出ます。どうすれば削除できるのでしょうか。 ちなみに、現在、「デスクトップ」フォルダは、 ・C:\Documents and Settings\Administrator\ ・C:\Documents and Settings\All Users\ ・C:\Windows\system32\config\systemprofile\ ・D:\ の4ケ所にあり、いずれのフォルダ内も空の状態です。 この状態にも拘わらず、ディスプレイの画面には、上記リンク切れアイコン(画面から消去できないアイコン)が残っているのです。 なお、冒頭に記述しましたDドライブへ移動した「デスクトップ」フォルダは、All Users\のものだったかどうかちょっと自信がありません(「ユーザー名\」のものだったかも?)。

  • クッキーのファイル名

    windowsXP+IE6.0を使用しています。 XPにログインするときは自分の名前のアカウントで行っています。私の名前は○○哲哉なので  C:\Documents and Settings\○○ 哲哉 というフォルダがホームディレクトリになっています。 しかしクッキーが保存される  C:\Documents and Settings\○○ 哲哉\Cookies フォルダのファイル名はちゃんとした名前ではなく  ○○ 渡哉@xxxx になっています。 どうでもいいことではありますが、気になります。ご存知の方、教えていただけますでしょうか。

  • フォルダ&ファイルをこのように効率的にコピーや削除するbatファイルは?

    Windows2000の環境です。 192.168.0.1(ファイルサーバ) | |─192.168.0.2 | 192.168.0.3 という環境です。 192.168.0.2や192.168.0.3のファイル&フォルダ環境を出来るだけ統一したく思っています(192.168.0.2と192.168.0.3を同時に使用することはありません)。 ログオフ時に \\192.168.0.2(3)\Documents and Settings\root\デスクトップ\ 下の子フォルダ&孫フォルダ&ファイルを \\192.168.0.1\Documents and Settings\root\デスクトップ\ に移して ログイン時には逆に \\192.168.0.1\Documents and Settings\root\デスクトップ\ 下の子フォルダ&孫フォルダ&ファイルを \\192.168.0.2(3)\Documents and Settings\root\デスクトップ\ に移したいのですが 単にログオフ時に \\192.168.0.1\Documents and Settings\root\デスクトップ\ の子フォルダ&孫フォルダ&ファイルを全削除して \\192.168.0.2(3)\Documents and Settings\root\デスクトップ\ の子フォルダ&孫フォルダ&ファイルを全コピーするとフォルダサイズとかが大きい場合にはログイン完了やログオフ完了までかなりの時間がかかってします。 それでタイムスタンプが同じファイルは無視して \\192.168.0.2(3)\Documents and Settings\root\デスクトップ\ 下にあってタイムスタンプが新しいものは \\192.168.0.1\Documents and Settings\root\デスクトップ\ 下にコピー そして \\192.168.0.2(3)\Documents and Settings\root\デスクトップ\ 下に存在してなくて \\192.168.0.1\Documents and Settings\root\デスクトップ\ にあるものは削除するようにする。 ログイン時には同様の逆の手順で行えば単時間で \\192.168.0.2\Documents and Settings\root\デスクトップ\ と \\192.168.0.3\Documents and Settings\root\デスクトップ\ ともコピー&削除作業時間を浪費せずに同じフォルダ&ファイル環境を築けると考えます。 このようにするにはbatファイルをどのように記述すれば宜しいでしょうか?

  • KNOPPIXによるデータ救済で、デスクトップ保存のファイルは救済可能?

    愛用のパソコンが起動不良に陥り、KNOPPIXによるデータ救済を試みようと思っています。 KNOPPIXで起動して確認したところ、Cドライブ内のマイドキュメントなどのファイルは壊れていないもようで救済は可能と思うのですが、デスクトップ上に保存していたファイルの行方が分からずに困っています。 通常ならC:¥Documents and Settings内の下位フォルダにデスクトップ保存のファイルがあるはずなのですが、C:¥Documents and Settingsの中を探してみても該当フォルダが見つからないのです。 できれば取り出したいファイルがあるので何とか探し出したいのです。 用件のみですみませんが、よろしくお願いいたします。

  • FTPでのファイル取得について

    Linaxサーバ上に、 /aaa というフォルダがあり、 そのフォルダの中に C:\Documents and Settings\bbb.txt というファイルがあるとします。 このファイルをWindowsクライアント上にFTPでダウンロードしたいのですが・・・ Settings\bbb.txt という、最後のスペース以降しか取得できないようで、どなたかご存知の方がおられましたら、よろしくお願い致します。

  • デスクトップ上のファイルへのパスを教えてください。

    デスクトップ上にあるファイルへのパスはWindows XPとWindows 7の場合は以下のようになっていますが、Windows 8の場合はどのようになるのでしょうか。Windows 7と同様と考えてよろしいでしょうか。 ○Windows XP C:\Documents and Settings\ユーザー名\デスクトップ\ファイル名.拡張子 ○Windows 7 C:\Users\ユーザー名\Desktop\ファイル名.拡張子

専門家に質問してみよう