プロが教える店舗&オフィスのセキュリティ対策術

環境 WindowsXP + VC6++

自作アプリが動作中に作成するログをいつまでも取っておくと
DISKFULLになるため一定期間(90日)以上前のファイルを削除すべく
以下のような関数を作りスレッドとして起動しました
(一部書き直してます)

ところがこの処理動かすとアプリケーションが
ほぼ3時間でハングアップします
デバッガのスタック見ると nTime.Format("%Y/%m/%d %H:%M:%S");
などのCString代入辺りでアロケーションエラーを起こしているようです
(タスクマネージャとかでは殆ど変動ありません)

なんでエラーになるんだろう状態なんですが何か問題あるのでしょうか?
自分的には問題ないと思ってるんですが思い込みの可能性もあるので
何かありましたら御指摘願います

int EraseFile(const char *folderfile, 自作Dialogクラス* pClass)
{
 chardrive[_MAX_DRIVE];
 chardir[_MAX_DIR];
 charfname[_MAX_PATH];
 charext[_MAX_EXT];

  _splitpath(folderfile, drive, dir, fname, ext);

  int c = 0;
  CFileFind finder;
  BOOL bWorking = finder.FindFile(folderfile);

  while((bWorking) && (pClass->th_end_flg == 0)) {
   bWorking = finder.FindNextFile();
   sprintf(fname, "%s\\%s\\%s\\*.*", drive, dir,finder.GetFileName());

   if(finder.IsDots()){// カレント・親フォルダなら無視
    continue;
   }
  if(finder.IsDirectory()){// フォルダだったらフォルダ以下削除チェック
   if (EraseFile(fname, pClass) != 0) {
    c ++;
    continue;
   }

   sprintf(fname, "%s", finder.GetFilePath());
   CTimenTime = CTime::GetCurrentTime();
   CTimefTime;
   finder.GetLastWriteTime(fTime) ;

   CStrings, s1;
   s = nTime.Format("%Y/%m/%d %H:%M:%S");
   s1 = fTime.Format("%Y/%m/%d %H:%M:%S");

   nTime -= CTimeSpan(90, 0, 0, 0);
   s = nTime.Format("%Y/%m/%d %H:%M:%S");

   if (nTime <= fTime) {
    return(1);
   }

   sprintf(fname, "%s\\%s\\%s\\", drive, dir, finder.GetFileName());
   _rmdir(fname);
   return(c);
  }

  sprintf(fname, "%s", finder.GetFilePath());
  CTimenTime = CTime::GetCurrentTime();
  CTimefTime;
  finder.GetLastWriteTime(fTime) ;

  CStrings, s1;
  s = nTime.Format("%Y/%m/%d %H:%M:%S");
  s1 = fTime.Format("%Y/%m/%d %H:%M:%S");

  nTime -= CTimeSpan(90, 0, 0, 0);
  s = nTime.Format("%Y/%m/%d %H:%M:%S");

  if (nTime <= fTime) {
   c ++;
   continue;
  }

  CFile::Remove(fname);
 }

 return(c);
}

//----------------------------------
//スレッド本体
//----------------------------------
UINT 自作Dialogクラス::LogFileAutoEraseThread(PVOID pParam)
{
 自作Dialogクラス* pClass=(自作Dialogクラス*)pParam;

 while(pClass->th_end_flg == 0){
  chardrive[_MAX_DRIVE];
  chardir[_MAX_DIR];
  charfname[_MAX_PATH];
  charext[_MAX_EXT];
 
  Sleep(10);
  _splitpath(アプリケーション実行モジュールフルパス, drive, dir, fname, ext);
  sprintf(fname, "%s\\%s\\%s\\*.*", drive, USER_NAME_FOLDER, RESULT_FILE_OUTPUT_PATH);
  EraseFile(fname, pClass);

  Sleep(10);
  sprintf(fname, "%s\\%s\\%s\\*.*", drive, USER_NAME_FOLDER, RESULT_FILE_OUTPUT_CSV);
  EraseFile(fname, pClass);

  Sleep(10);
  sprintf(fname, "%s\\%s\\Log\\*.*", drive, USER_NAME_FOLDER);
  EraseFile(fname, pClass);
 }
 return(0);
}

A 回答 (2件)

ざっとしか見てませんが


とくにおかしいところはないですね

ためしに時刻を文字列に変換している
ところをすべて消してみては?

恐らくデバッグ用にしてるだけで
ファイルに出力しているわけでは
なさそうですし

以下、気になったところ
・charの配列を初期化していないのはいやですね
char dir[_MAX_DIR] = {0};
という感じで初期化するべきです。

・日付の比較を2箇所でやってますが
 一つの関数にするべきです。
もし90日でなく120日とかにでもなると
直すところが2箇所
いやですね~

・fnameを使いまわしているのが気になります
フルパス用に一つ変数を用意するべきでは?

いじょ
    • good
    • 0
この回答へのお礼

ありがとうございます

>とくにおかしいところはないですね
ですよね

>ためしに時刻を文字列に変換している
>ところをすべて消してみては?
それも考えたんですが根本の解決にはならないと考えたもので
今回はあえて原因調べる意図で質問させていただきました
(デバッグ用に変換してるのはご想像道理です)

お礼日時:2010/02/07 01:02

この回答への補足

情報ありがとうございます
URL見ましたがどうも同じ現象のようです

現場でテスト中のため時間かけて調査するわけに行かないのですが_heap_alloc_dbgでエラーになってるのはまったく同じです
また実際テスト環境下での手元PCではシュミレーションで6時間以上
動作させましたが現象は発生していません

実機テストできるのは月曜以降になるのですが
Emptyを使うかCStringの使用をやめるかどちらかの対処を行ったもので
テストして見ようかと思います(3時間かかるのが涙物です)

結果は改めて書き込ませていただきます

補足日時:2010/02/07 01:02
    • good
    • 0
この回答へのお礼

本日変更かけたソースにて7時間ほど連続運転したところ状況が改善されてました
こんな意味不明なことがありうるとは・・・・困ったもんだ

お礼日時:2010/02/08 20:16

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