なぜアロケーションエラーになるのかが分かりません
環境 WindowsXP + VC6++
自作アプリが動作中に作成するログをいつまでも取っておくと
DISKFULLになるため一定期間(90日)以上前のファイルを削除すべく
以下のような関数を作りスレッドとして起動しました
(一部書き直してます)
ところがこの処理動かすとアプリケーションが
ほぼ3時間でハングアップします
デバッガのスタック見ると nTime.Format("%Y/%m/%d %H:%M:%S");
などのCString代入辺りでアロケーションエラーを起こしているようです
(タスクマネージャとかでは殆ど変動ありません)
なんでエラーになるんだろう状態なんですが何か問題あるのでしょうか?
自分的には問題ないと思ってるんですが思い込みの可能性もあるので
何かありましたら御指摘願います
int EraseFile(const char *folderfile, 自作Dialogクラス* pClass)
{
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_PATH];
char ext[_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());
CTime nTime = CTime::GetCurrentTime();
CTime fTime;
finder.GetLastWriteTime(fTime) ;
CString s, 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());
CTime nTime = CTime::GetCurrentTime();
CTime fTime;
finder.GetLastWriteTime(fTime) ;
CString s, 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){
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_PATH];
char ext[_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);
}
お礼
ありがとうございました。 解決する事ができました。 また、質問する事があるとおもいますが 宜しくお願い致します。