CFile::GetStatusで落ちる

解決


しゅん  2008-06-14 03:29:58  No: 68556  IP: 192.*.*.*

いつもお世話になっております

VisualStudio2005 MFC, XP/Vistaで開発しています。


ファイルパスがディレクトリかどうかを調べる為に、

CFile::GetStatus( csFilePath, fileStatus );

で、ファイルステータスを取っているのですが、とあるファイルでランタイムエラーとなり落ちてしまいます。

atltime.inl内の mktime64() 辺りで死んでいる様です。

***
File: f:\sp\vctools\vc7libs\ship\atlmfc\include\atltime.inl
Line: 197

Expression: m_time != -1
***

とあるファイルというのは、恐らくWindowsの古いバージョンの時代から有る
バックアップされたファイルで、現在Vistaでそのファイルをエクスプローラで見ると、更新日時が 1920 年とかになっており時間情報が壊れてるっぽい
感じはします。

ですが、流石にエラーでプログラムが止まるのは避けたいので何とかしたい
のですが、何か良い知恵は無いでしょうか?

GetStatus()を呼ぶ前にこれを呼んでおけ、とかそういう感じのアドバイスを
頂けると助かります。

よろしくお願いいたします。

# ちなみにIPが出るのは私はさほど気になりません。
# ただ、回答者の方が減ると非常に残念です...

編集 削除
tetrapod  2008-06-16 10:57:39  No: 68557  IP: 192.*.*.*

CTime::CTime は 1920 年を取り扱えないのでこうなっちゃうようだ
CTime t(1920,3,2, 0,0,0, 0); // Debug Assertion
そもそもそんな昔に MS-DOS は無かったわけでサポートされていないらしい
# 2038 年問題にも通じる難しい話だなぁ

回避策なんだけど、
・そのファイルの壊れた日付を適宜直す(プログラムは直さなくていい)
かな。
他にもいくつか考えてみたんだけど実用性に欠けるのでこれがベストだと思う

編集 削除
しゅん  2008-06-17 23:04:43  No: 68558  IP: 192.*.*.*

なるほど、やはりそうですか...

結局、本質的な解では無いのですが、

DWORD  dwAttribute = ::GetFileAttributes( csFilePath );
// ディレクトリは登録しない
if( dwAttribute & CFile::directory )
    return FALSE;

こんな感じでやってしまいました。

何にせよ有難うございました!

編集 削除