開発環境
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) フォルダ内のエクセルファイルを開かずにデータ採取する関数式 2 2022/12/22 22:15
- Windows 10 コマンドプロンプトの使い方 1 2022/10/13 14:43
- セキュリティホール・脆弱性 デスクトップファイル同期解除 2 2022/12/22 13:43
- デスクトップパソコン フォルダ内のファイルをコピペ 2 2022/05/30 14:34
- Windows 10 ネットからファイルをデスクトップにダウンロードする際、既存のファイルの並びが崩れてしまう 4 2022/04/19 08:20
- Windows 10 ショートカットの作り方と使い方について教えて下さい。 3 2022/05/27 08:44
- その他(プログラミング・Web制作) 図に示す階層構造で,現在のディレクトリ(カレントディレクトリという)が*印のディレクトリであるとき, 2 2022/11/16 10:55
- Visual Basic(VBA) ワイルドカード「*」を使うとうまくいかないマクロの添削をお願いします 3 2022/03/26 09:39
- Windows 10 デスクトップにファイルを保存すると既存のファイルアイコンの列に割り込むように保存されて困ってます 2 2022/04/25 19:00
- Windows 10 エクスプローラで希望の場所が表示できない 2 2023/06/29 15:19
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フルパスから最後のディレクト...
-
どんなプログラムを書いても指...
-
ファイルやディレクトリの存在...
-
FTPでputすると空ファイルが出...
-
ファイルのパスを動的に取得
-
windows.hがincludeされない
-
fopenで別ディレクトリにファイ...
-
ファイルダイアログのカレント...
-
MATLABのsaveでファイル名を試...
-
WindowsXPにおけるDLLの検索順序
-
絶対パスとフルパスの違いがイ...
-
フォルダ名をだすには
-
「UNCパスはサポートされません...
-
GetPrivateProfileStringでini...
-
C言語を用いたファイルの一括削...
-
ExcelVBA サーバーの(共有フォ...
-
相対パスの指定
-
webアプリケーションでの画像フ...
-
圧縮(Zip)について
-
Ubuntu テキストファイルをどこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フルパスから最後のディレクト...
-
どんなプログラムを書いても指...
-
FTPでputすると空ファイルが出...
-
ExcelVBAでカレントディレクト...
-
windows.hがincludeされない
-
GetPrivateProfileStringでini...
-
マイクラでPythonのプログラミ...
-
fopenで別ディレクトリにファイ...
-
「UNCパスはサポートされません...
-
ファイルやディレクトリの存在...
-
ExcelVBA サーバーの(共有フォ...
-
C言語を用いたファイルの一括削...
-
ファイルダイアログのカレント...
-
ネットワーク上のコンピュータ...
-
セルに入力されたパスでフォル...
-
webアプリケーションでの画像フ...
-
エクセルVBAで相対パスでファイ...
-
絶対パスの絶対て英語で何でし...
-
VBでフォルダ単位のFTP
-
EXCELでダイアログボックスを開...
おすすめ情報