よろしくお願いします。
環境;Windows7 32bit
VS10 MFC
ファイルの有無をMFC のCFileFind クラスのFindFile メソッドで取得し、ファイルが存
在する場合
ifstream で開こうとすると、例外が発生します。
原因がわかりません、ご教示願います。
/*----------------------------------------------------------------------------*/
// FileFind(CString cd)
/*----------------------------------------------------------------------------*/
/**
* @brief ファイルが無ければダウンロードを行う。または
* 現在の日付とファイルのタイムスタンプ(日付)を取得して異
なれば、旧ファイルを削除しダウンロードする。
* ファイルが存在する場合、既存のファイルにて処理を進める。
* @param cd コード番号
*/
/*----------------------------------------------------------------------------*/
void CMChartDoc::FileFind(CString cd)
{
BOOL IsFile = FALSE;
CString lpszFilePath;
CString lpszFname = cd + _T(.csv);
CString cEMes = _T(ファイルが開けれません);
CFileFind find;
try {
lpszFilePath = _T(../\\Data\\) + lpszFname;
IsFile = find.FindFile( lpszFilePath );
find.Close();
//! @brief ファイルが無いときはダウンロード <br>
if( !IsFile ) {
Download( cd );
//! @brief ファイルは有る。且つ、日付が異なる場合はダウンロード <br>
} else if( IsFile == TRUE && IsFileTimeStamp(lpszFilePath) == FALSE) {
CFile::Remove(lpszFilePath);
Download(cd);
}
ifstream incsv(lpszFilePath);
if( incsv.fail( ) ) //! ここで例外処理発生
throw cEMes;
} catch (CInternetException* pEx) { std::cout << pEx << std::endl;
} catch ( ... ) { cout << m_strEMes << std::endl;
}
}
短い割にツッコミどころ満載なのであるが・・・
パス文字として ../\\Data\\ はヘン (POSIX path と DOS path が混じってる)
Download は絶対に成功するわけだね?失敗するとファイルは無い。
Download がダウンロードするファイルは ../Data/123.csv で間違いない?
UAC でバーチャルストアにリダイレクトされていたりしない?
Download は非同期だったりしない?完全完了、ファイルは閉じ済み?
相対パスを指定しているのであるが、カレントディレクトリは大丈夫?
ifstream incsv はその後使わないわけ?
GUI アプリっぽいけど std::cout に出力して何がしたいの?
ファイルが無いかも? ディレクトリが無いかも? 権限が無いかも?
とりあえず失敗原因を探るため incsv.fail() 時に GetLastError を呼ぶべし。
まずは、具体的な原因を探る事が先決でしょう。
例外が発生しますと書かれても原因は解りません。
動かしている環境に依存する部分もありますから
提示されているソースだけではありえる状況を列挙する事は出来ても
それ以上は無理ですし、具体的な原因は多分ご本人でないと
探れないと思いますよ。