VC++初心者ですいません。
やりたいことはフォルダ選択ダイアログで選択されたフォルダ内にあるファイルを拡張
子で検索して存在したら表示ウインドに表示させたいと考えています。
現在、拡張子の検索まではできているのですが、検索された拡張子のファイル名を取得
する方法ができていません。
どうすればファイル名を取得できるのでしょうか?
環境はVisual Studio2005 VC++ Windows XPです。
//フォルダ選択ダイアログ 表示
pIDList = ::SHBrowseForFolder(&bInfo);
if(pIDList == NULL)
{ //キャンセル時
}else{ //選択時
if(!::SHGetPathFromIDList(pIDList, path))
{ //エラー時
AfxMessageBox(フォルダを選択できません);
}else {
CString FileName = (C:\\Test\\%d\\,bInfo.pszDisplayName);
WIN32_FIND_DATA FileData;
//ファイルの検索
CString FName = FileName+\\*.avi;
HANDLE hFind = FindFirstFile(FName, &FileData);
if(hFind == INVALID_HANDLE_VALUE){
AfxMessageBox(動画ファイルはありません);
}else{
AfxMessageBox(ファイルを発見しました);
// AVIファイルを開く
hAVIWnd = MCIWndCreate(GetDlgItem(IDC_MOVIE)->m_hWnd,AfxGetInstanceHandle
(),MCIWNDF_NOMENU|MCIWNDF_NOOPEN|WS_MAXIMIZE |WS_VISIBLE|WS_CHILD,FName);
}
FindClose(hFind);
}
// 最後にpIDListのポイントしているメモリを開放します
::CoTaskMemFree( pIDList );
}
宜しくご指導下さい。
??
FindFirstFileの使い方についてちゃんと調べましたか?
MSDNの見てもその物ずばりのソースがちゃんと提示されていますけれど。
WIN32_FIND_DATAの中身がわかれば、自ずとわかりそうな気がします。
調べる時は関数その物だけを調べるのではなくて、その関数が使っている
構造体の中身まで調べるようにしないと解決に結びつかないですよ。
PATIOさん
素早い返信有難うございます。
自分の文章の理解不足かもしれませんが、
PATIOさんと認識がずれているような気がします。
PATIOさんが言ってくれているのは、検索された拡張子のファイル名を
取得できるのでしょうか?
例えば、TESTフォルダにtest.aviというAVIファイルがあるとします。
それをTESTフォルダを選択して
\\*.aviをFindfirstFileで検索するとtest.aviというファイル名も取得できるのです
か?
上述している自分のソースをブレークポイントしていくと*.aviのままでtest.aviは取得
できないのですが・・・
MSDNをどう読んでも、FindfirstFileが成功すれば、
上のコードだとFileData.cFileName(リファレンスだとFindFileData.cFileName)に
ファイル名があると思うけど。
通行人さん
返信ありがとうございます。
違うとこをウォッチしてました。
申し訳ないです。
FindFirstFile() の MSDN に載っている サンプルそのままです。
http://msdn.microsoft.com/ja-jp/library/cc429233.aspx
どこが違うか、よ~く見比べてください。
ありゃ、もう解決してた。。。
失礼しました。
bunさんも有難うございます。
ファイル名を取得することは出来たのですが、MCIで取得したAVIファイルが開け
ません。
CString cFName = FileData.cFileName;
hAVIWnd = MCIWndCreate(GetDlgItem(IDC_MOVIE_RANGE)->m_hWnd,AfxGetInstanceHandle
(),MCIWNDF_NOMENU|MCIWNDF_NOOPEN|WS_MAXIMIZE |WS_VISIBLE|WS_CHILD,cFName);
指定されたファイルが見つかりません。パスとファイル名が正しいかどうか確認して下
さい。というエラーが出てしまいます。
ファイル名も間違ってないのになぜでしょうか?
cFileName にPath情報はある?
ん?さん
返信有難うございます。
Path情報を取得するにはどうすればよいでしょうか?
>>CString cFName = FileData.cFileName;
の部分を
CString cFName = (FileName+\\%d,FileData.cFileName);
に変更してPathを取得しましたが
同じエラーが出てしまいます。
どこがいけないのでしょうか?
取得しないで検索したパス名を自分で追加すればえぇ。
それだけだと思うな。
金魚ちゃんさん
返信有難うございます。
>>取得しないで検索したパス名を自分で追加すればえぇ。
CString cFName = (FileName+\\%d,FileData.cFileName);
ではダメなんですか?
その cFName が期待通りになっていることを確認しましたか?
というか、その一行がどういう処理をしているのか、あなたには説明できますか?
シャノンさん
返信有難うございます。
cFNameは期待通りではありません。
cFileNameのファイル名しか入っておらず、パスまで取得できてませんでした。
>>CString cFName = (FileName+\\%d,FileData.cFileName);
でFileNameとcFileNameを合わせてくれると思ってたんですけどダメでした。