質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

1回答

456閲覧

出力先ファイルが既存か否かの情報を取得したい(Win32API)

yama_07

総合スコア4

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

0クリップ

投稿2023/01/20 07:19

前提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++

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yama_07

2023/01/20 07:25

申し訳ないです。解決しました。
y_waiwai

2023/01/20 07:33

ならその旨を自己回答して、解決済みにしときましょう
yama_07

2023/01/20 07:53

承知しました。ありがとうございます。
guest

回答1

0

自己解決

参考: https://learn.microsoft.com/ja-jp/windows/win32/api/fileapi/nf-fileapi-createfilea


OPEN_ALWAYS
4
常にファイルを開きます。
指定したファイルが存在する場合、関数は成功し、最後のエラー コードは ERROR_ALREADY_EXISTS (183) に設定されます。

指定したファイルが存在せず、書き込み可能な場所への有効なパスである場合、関数はファイルを作成し、最後のエラー コードを 0 に設定します。


とあるので、このエラーコードを確認することで分岐できそうです。

投稿2023/01/20 08:05

yama_07

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

同じタグがついた質問を見る

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。