前提1
関数CreateFile()
を使ってファイルハンドルを取得し、関数WriteFile()
によってある文字列と数値が入ったデータをcsvファイルに書き込むといった処理における質問です。
前提2
以下のようなソースコードによりファイルが既に存在する場合は上書き、存在しない場合は新しいファイルを作成するようにしました。
さらに、ファイルへの書き込みの開始点をファイルの終了位置に設定しました。
c++
1static char[256] FileName; 2 3// [名前を付けて保存]ダイアログボックスの作成 4bool SelectFile(HWND hWnd) { 5 6 static OPENFILENAME ofn; 7 memset(&ofn, 0, sizeof(ofn)); 8 memset(&FileName, 0, sizeof(FileName)); 9 10 // OPENFILENAME 構造体の初期化 11 ofn.lStructSize = sizeof(ofn); 12 ofn.hwndOwner = hWnd; 13 //ofn.lpstrFilter = _T("Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0"); 14 ofn.lpstrFilter = _T("CSV Files(*.csv)\0*.csv\0All Files(*.*)\0*.*\0\0"); 15 ofn.lpstrFile = FileName; 16 ofn.nMaxFile = MAX_PATH; 17 ofn.lpstrDefExt = _T("csv"); 18 ofn.Flags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST; 19 ofn.lpstrTitle = "名前を付けて保存"; 20 21 if (!GetSaveFileName(&ofn)) { 22 MessageBox(hWnd, _T("ファイルを作成できませんでした。"), _T("エラー"), MB_OK | MB_ICONERROR); 23 return false; 24 } 25 return true; 26} 27 28// ファイルのオープン 29bool file_open() { 30 hfile = CreateFile( 31 FileName, 32 GENERIC_READ | GENERIC_WRITE, 33 0, 34 NULL, 35 OPEN_ALWAYS, 36 FILE_ATTRIBUTE_NORMAL, 37 NULL 38 ); 39 if (hfile == INVALID_HANDLE_VALUE) { 40 MessageBox(NULL, _T("ファイルの作成に失敗しました。"), _T("エラー"), MB_OK); 41 return 1; 42 } 43 44// 出力の開始点を現在のファイルの終了位置に設定 45 SetFilePointer(hfile, 0, NULL, FILE_END); 46 47 return true; 48} 49
実現したいこと
出力先が新しいファイルの場合はデータAを、既存のファイルに上書きする場合はデータBを書き込みたいです。
そこで、指定ファイルが既存か否かという情報を取得し、それによって条件分岐させ書き込むデータを変えるといったことを実現させたいと思っています。
質問
このとき、ファイルが既存か否かという情報の取得は、指定したファイルのサイズをまず取得し、そのサイズの大きさがある閾値を超えたか否かによって条件分岐させるという方針でよろしいのでしょうか?
もしくは何かもっとスマートにファイルが既存か否かという情報を取得できる方法があるのでしょうか?
補足情報(FW/ツールのバージョンなど)
Vidual Studio 2019
c++
回答1件