アプリ版:「スタンプのみでお礼する」機能のリリースについて

VC++6.0のMFCで開発しています。
フォルダをどろっぷしてフォルダ内のファイルを取り出すという
プログラムです。

メインダイアログのクラス
for(int p=0;p<__argc-1;i++)
{
CFileFind find;
CString vv;
vv=__argv[p];
CString Newstr=vv+_T("\\*.*");
if(find.FindFile(Newstr)){
int i=1;
while(i){
if(__argv[p]==""){
return 0;
}
i=find.FindNextFile();
if(find.IsDots()){
continue;
}
if(find.IsDirectory()){

FolderDrop(find.GetFilePath());

}
CStringfilename=vv+"\\"+find.GetFileName();
CString kakucho=GetKaku(filename);
while((index3=m_listC.GetNextItem(index3,LVNI_ALL))!=-1){
indexstr=m_listC.GetItemText(index3,0);
if(kakucho==indexstr){
kdlg.m_DirectoryFileNameArray.Add(filename);
}
}
m_FilenameArray.Add(filename);
m_FolderFileNumber++;

}
find.Close();
}

}

void CDragDrop6Dlg::FolderDrop(CString str)
{
CString kakucho;
int i=m_listC.GetItemCount();
CString indexstr;
CString filename2;
CKakuninDlg kdlg;
int p;
int index3=-1;


for(p=0;p<=c;p++){//ドロップしたファイルがディレクトリの場合
CFileFind find;
CString Newstr=str+_T("\\*.*");
if(find.FindFile(Newstr)){
int i=1;
while(i){ i=find.FindNextFile();
if(find.IsDots()){
continue;
}
if(find.IsDirectory()){
FolderDrop(find.GetFilePath());}
filename2=str+"\\"+find.GetFileName();
kakucho=GetKaku(filename2)//ファイルの拡張子を取り出す
while((index3=m_listC.GetNextItem(index3,LVNI_ALL))!=-1){
indexstr=m_listC.GetItemText(index3,0);
if(kakucho==indexstr){

kdlg.m_DirectoryFileNameArray.Add(filename2);


}
}



m_FilenameArray.Add(filename2);
m_FolderFileNumber++;

}
find.Close();
}

}


としてフォルダAの中にフォルダBが入っていてその中に入っているファイルCを取り出したいのです。

このプログラムではドロップしたファイルが
一番目のプログラムでフォルダA内の中身がファイルならfilenameに
フォルダならBに潜り込む所まではいけました。

しかし実際に別ダイアログに取り出した全てのファイルの一覧を出すと
A内のプログラムしか表示されません。どこがいけないのでしょうか?

A 回答 (1件)

find.FindNextFile()で取得した名前がフォルダー(ディレクトリ)だった場合とファイルだった場合で動作がおかしくありませんか



if ( find.IsDirectory() ) {
  FileDrop(find.GetFilePath());
}
filename2=str+"\\"+find.GetFileName();
kakucho=GetKaku(filename2)//ファイルの拡張子を取り出す
while((index3=m_listC.GetNextItem(index3,LVNI_ALL))!=-1){
といった記述だと フォルダーの場合FileDropが再帰で呼ばれますが
そこから帰った後 filename2 = ... の部分も実行してしまいますよ

if ( find.IsDirectory() ) {
  // フォルダーなので再帰
  FileDrop(find.GetFilePath());
} else {
  // ファイル名なのでリストに登録
  filename2=str+"\\"+find.GetFileName();
  kakucho=GetKaku(filename2)//ファイルの拡張子を取り出す
  while((index3=m_listC.GetNextItem(index3,LVNI_ALL))!=-1){
    // 中略
  }
}
といった具合にしたほうがいいでしょう

期待する動作と異なる動作をしていそうな部分に
ブレークポイントを設定してステップ実行するなどして見ましょう

> for(p=0;p<=c;p++){//ドロップしたファイルがディレクトリの場合
で cは定義されていないようですが forループの中に入ってきますか?
グローバル変数などで定義しているならDebug時には0xC0など特殊な初期化していませんの値になっています
Release時には 0になってしまっている場合があります

この回答への補足

試してませんでした。ブレークポイントに関しては
InitDialogがメインで行っているクラスですので
見れなかったきがします。

補足日時:2009/04/22 00:14
    • good
    • 0

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