開発環境
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では調査出来ないのでしょうか?
他に方法はありますか?
どうか教えてください。
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;
}
以上。
回答ありがとうございます。
概ね何が悪いのか判ってきました。
どうやらFindFirstFileを使用した外部関数内でのパスの扱いで汎用的なコードを用いていなかったことが原因のようです。
ありがとうございました。
No.1
- 回答日時:
★最初に。
>これはWindowsの仕様の動作なのでしょうか。
>特殊フォルダであるデスクトップは、FindFirstFileでは調査出来ないのでしょうか?
>他に方法はありますか?
↑
特殊フォルダであっても SHGetFolderPath() 関数で取得したフルパスは実際に存在する
普通のディレクトリと同じです。なので同じように扱えます。
・上手くいかなかったのはソースを見ないと分かりません。
次のリンクにソースを載せた過去があります。
http://oshiete1.goo.ne.jp/qa3220015.html→『あるディレクトリ内のファイルをファイル名でソートして取得』
↑
このサンプルをコンソール・アプリケーションとして作成してコマンドラインから
デスクトップのパスをダブルクォーテーションで囲って試して見て下さい。
※私の環境では普通のディレクトリと同じく検索表示されています。
・以上。ソースなどを参考に。
参考URL:http://oshiete1.goo.ne.jp/qa3220015.html
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
つい集めてしまうものはなんですか?
人間誰もは1つ「やたらこればかり集めてしまう」というものがあるもの。 あなたにとって、つい集めてしまうものはなんですか?
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
【お題】引っかけ問題(締め切り10月27日(日)23時)
【大喜利】 「日本で一番高い山は富士山……ですが!」から始まった、それは当てられるわけ無いだろ!と思ったクイズの問題
-
昨日見た夢を教えて下さい
たまにすごいドラマチックな夢見ること、ありませんか? 起きてからも妙に記憶に残っているような、そんな夢。
-
好きな和訳タイトルを教えてください
洋書・洋画の素敵な和訳タイトルをたくさん知りたいです!【例】 『Wuthering Heights』→『嵐が丘』
-
FindFirstFileについて
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
どんなプログラムを書いても指...
-
フルパスから最後のディレクト...
-
マイクラでPythonのプログラミ...
-
FTPでputすると空ファイルが出...
-
ExcelVBA サーバーの(共有フォ...
-
ファイルやディレクトリの存在...
-
絶対パスの絶対て英語で何でし...
-
ExcelVBAでカレントディレクト...
-
「UNCパスはサポートされません...
-
windows.hがincludeされない
-
Windows inodeに変わるファイル...
-
ディレクトリ/ファイル リスト...
-
webアプリケーションでの画像フ...
-
ネットワーク上のコンピュータ...
-
セルに入力されたパスでフォル...
-
ShellExecute、エクスプローラ...
-
エクセルVBAで相対パスでファイ...
-
複数のファイルへの一括処理(...
-
圧縮(Zip)について
-
fopenで別ディレクトリにファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
どんなプログラムを書いても指...
-
フルパスから最後のディレクト...
-
FTPでputすると空ファイルが出...
-
「UNCパスはサポートされません...
-
絶対パスの絶対て英語で何でし...
-
windows.hがincludeされない
-
ExcelVBAでカレントディレクト...
-
ファイルやディレクトリの存在...
-
セルに入力されたパスでフォル...
-
C言語を用いたファイルの一括削...
-
fopenで別ディレクトリにファイ...
-
GetPrivateProfileStringでini...
-
ネットワーク上のコンピュータ...
-
マイクラでPythonのプログラミ...
-
ファイルダイアログのカレント...
-
webアプリケーションでの画像フ...
-
ExcelVBA サーバーの(共有フォ...
-
圧縮(Zip)について
-
pythonでの日本語操作
-
エクセルVBAで相対パスでファイ...
おすすめ情報