「MFCの基礎 - ファイル」の版間の差分
ナビゲーションに移動
検索に移動
細 (Wiki がページ「CFileとCStdioFileの使い方」を「MFCの基礎 - ファイル」に、リダイレクトを残さずに移動しました) |
編集の要約なし |
||
1行目: | 1行目: | ||
== ファイルを開く == | == ファイルを開く == | ||
< | <code>CFile</code>クラスの<code>Open</code>メソッドは、第1引数はファイル名、第2引数はファイルモードを指定する。<br> | ||
<syntaxhighlight lang="c++"> | |||
CFile File; | CFile File; | ||
if(File.Open(_T("test.dat"), CFile::modeCreate| CFile::modeNoTruncate | CFile::modeWrite | CFile::typeBinary)) | if(File.Open(_T("test.dat"), CFile::modeCreate| CFile::modeNoTruncate | CFile::modeWrite | CFile::typeBinary)) | ||
8行目: | 9行目: | ||
file.Close(); | file.Close(); | ||
</ | </syntaxhighlight> | ||
<br> | |||
主なモードを以下に記載する。<br> | 主なモードを以下に記載する。<br> | ||
CFile::modeCreate | <center> | ||
CFile::modeNoTruncate | {| class="wikitable" style="background-color:#fefefe;" | ||
CFile::modeRead | |- | ||
CFile::modeReadWrite ファイルを読み書き可能で開く。 | ! style="background-color:#00ffff;" | モード名 | ||
CFile::modeWrite ファイルを書き込み専用で開く。 | ! style="background-color:#00ffff;" | 説明 | ||
CFile::shareDenyNone 他プロセスからも読み書きできる状態でファイルを開く。 | |- | ||
CFile::shareExclusive ファイルを排他モードで開く。 | | CFile::modeCreate || ファイルを新規に作成する。<br>既にファイルがある場合は、削除して新規に作成する。 | ||
CFile::typeText | |- | ||
CFile::typeBinary | | CFile::modeNoTruncate || modeCreateと組み合わせて使用する場合、<br>既にファイルがある場合は新規作成せずに開く。 | ||
|- | |||
| CFile::modeRead || ファイルを読み取り専用で開く。 | |||
|- | |||
| CFile::modeReadWrite || ファイルを読み書き可能で開く。 | |||
|- | |||
| CFile::modeWrite || ファイルを書き込み専用で開く。 | |||
|- | |||
| CFile::shareDenyNone || 他プロセスからも読み書きできる状態でファイルを開く。 | |||
|- | |||
| CFile::shareExclusive || ファイルを排他モードで開く。 | |||
|- | |||
| CFile::typeText || テキストモードを設定する。<br>派生クラスで使用する。 | |||
|- | |||
| CFile::typeBinary || バイナリモードを設定する。<br>派生クラスで使用する。 | |||
|} | |||
</center> | |||
<br><br> | <br><br> | ||
== 1行ずつ読み込む == | == 1行ずつ読み込む == | ||
< | <syntaxhighlight lang="c++"> | ||
CStdioFile File(_T("test.dat"), CFile::modeCreate| CFile::modeNoTruncate | CFile::modeRead | CFile::typeText); | CStdioFile File(_T("test.dat"), CFile::modeCreate| CFile::modeNoTruncate | CFile::modeRead | CFile::typeText); | ||
CString strReadLine = _T(""); | CString strReadLine = _T(""); | ||
30行目: | 47行目: | ||
TRACE(strReadLine + _T("\n")); | TRACE(strReadLine + _T("\n")); | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
== ファイルに書き込む == | == ファイルに書き込む == | ||
< | <syntaxhighlight lang="c++"> | ||
CStdioFile File(_T("test.dat"), CFile::modeCreate| CFile::modeNoTruncate | CFile::modeWrite | CFile::typeText); | CStdioFile File(_T("test.dat"), CFile::modeCreate| CFile::modeNoTruncate | CFile::modeWrite | CFile::typeText); | ||
CString strWriteLine1 = _T("hoge\n"); | CString strWriteLine1 = _T("hoge\n"); | ||
43行目: | 60行目: | ||
File.Close(); | File.Close(); | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
49行目: | 66行目: | ||
CFileおよびCStdioFileには追記モードが存在しないので、ファイルを開いた後、書き込み位置を指定する必要がある。 | CFileおよびCStdioFileには追記モードが存在しないので、ファイルを開いた後、書き込み位置を指定する必要がある。 | ||
下記のサンプルコードでは、ファイルを書き込みモードで開いた後、SeekToEndメソッドで書き込み位置を最後尾に移動する。 | 下記のサンプルコードでは、ファイルを書き込みモードで開いた後、SeekToEndメソッドで書き込み位置を最後尾に移動する。 | ||
< | <syntaxhighlight lang="c++"> | ||
CStdioFile File(_T("test.dat"), CFile::modeCreate| CFile::modeNoTruncate | CFile::modeWrite | CFile::typeText); | CStdioFile File(_T("test.dat"), CFile::modeCreate| CFile::modeNoTruncate | CFile::modeWrite | CFile::typeText); | ||
File.SeekToEnd(); // 書き込み位置を最後尾に移動 | File.SeekToEnd(); // 書き込み位置を最後尾に移動 | ||
60行目: | 77行目: | ||
File.Close(); | File.Close(); | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
== ファイルを削除する == | == ファイルを削除する == | ||
< | <syntaxhighlight lang="c++"> | ||
// 単一のファイルを削除する | // 単一のファイルを削除する | ||
CFile::Remove(_T("C:\\test.txt")); // Cドライブ直下のtest.txtファイルを削除する | CFile::Remove(_T("C:\\test.txt")); // Cドライブ直下のtest.txtファイルを削除する | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
< | <syntaxhighlight lang="c++"> | ||
// 複数のファイルやディレクトリを削除する | // 複数のファイルやディレクトリを削除する | ||
CString strRemoveDirPath = _T("C:\\test?"); | CString strRemoveDirPath = _T("C:\\test?"); | ||
82行目: | 99行目: | ||
SHFileOperation(&drive); | SHFileOperation(&drive); | ||
</ | </syntaxhighlight> | ||
wFuncは、下記に示す通り、実行する操作を指定する。<br> | wFuncは、下記に示す通り、実行する操作を指定する。<br> | ||
{| class="wikitable" | <center> | ||
{| class="wikitable" style="background-color:#fefefe;" | |||
|- | |- | ||
! 命令マクロ ! | ! style="background-color:#00ffff;" | 命令マクロ | ||
! style="background-color:#00ffff;" | 説明 | |||
|- | |- | ||
| FO_MOVE || pFromをpToの位置に移動 | | FO_MOVE || pFromをpToの位置に移動 | ||
95行目: | 114行目: | ||
|- | |- | ||
| FO_RENAME || pFromをpToに変更 | | FO_RENAME || pFromをpToに変更 | ||
|} | |} | ||
</center> | |||
pFromにはディレクトリおよびファイルを指定する。ワイルドカードも使用できる。<br> | pFromにはディレクトリおよびファイルを指定する。ワイルドカードも使用できる。<br> | ||
また、NULL文字(\0)で区切ると複数指定できる。<br> | また、NULL文字(\0)で区切ると複数指定できる。<br> | ||
<br> | <br> | ||
fFlagは、下記に示す通り、動作時のフラグを指定する。<br> | fFlagは、下記に示す通り、動作時のフラグを指定する。<br> | ||
{| class="wikitable" | <center> | ||
{| class="wikitable" style="background-color:#fefefe;" | |||
|- | |- | ||
! 命令マクロ ! | ! style="background-color:#00ffff;" | 命令マクロ | ||
! style="background-color:#00ffff;" | 説明 | |||
|- | |- | ||
| FOF_SILENT || 経過を表すダイアログボックス非表示 | | FOF_SILENT || 経過を表すダイアログボックス非表示 | ||
111行目: | 133行目: | ||
|- | |- | ||
| FOF_NOCONFIRMATION || 表示されるダイアログボックスで『はい』または『すべて』を選択する | | FOF_NOCONFIRMATION || 表示されるダイアログボックスで『はい』または『すべて』を選択する | ||
|} | |} | ||
</center> | |||
<br><br> | |||
== ファイルの再帰検索 == | |||
以下の例では、指定したディレクトリに存在する全てのファイルを再帰検索している。<br> | |||
<syntaxhighlight lang="c++"> | |||
// 関数内で自分自身を呼び出す再帰関数を作る | |||
void CSampleView::SerchFiles(CString Path) | |||
{ | |||
// ファイルの検索 | |||
CFileFind Finder; | |||
Path += _T("\\*.*"); | |||
BOOL bWorking = Finder.FindFile(Path, 0); | |||
while(bWorking) | |||
{ | |||
bWorking = Finder.FindNextFile(); | |||
CString Getpath = Finder.GetFilePath(); | |||
CString Getname = Finder.GetFileName(); | |||
// 再帰的にディレクトリアイテムを作成 | |||
if(!(GetFileAttributes(Getpath) & FILE_ATTRIBUTE_DIRECTORY)) | |||
{ // ファイルの場合 | |||
} | |||
else | |||
{ | |||
if(Getname != _T(".") && Getname != _T("..")) | |||
{ // ディレクトリの場合 | |||
SerchFiles(Getpath); | |||
} | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
例えば、以下のようにSerchFilesメソッドを呼べば、次のようにDドライブの内容を全て書き出す。<br> | |||
<syntaxhighlight lang="c++"> | |||
SerchFiles(_T("D:\\")) | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:MFC]] | [[カテゴリ:MFC]] |
2021年1月29日 (金) 16:32時点における版
ファイルを開く
CFile
クラスのOpen
メソッドは、第1引数はファイル名、第2引数はファイルモードを指定する。
CFile File;
if(File.Open(_T("test.dat"), CFile::modeCreate| CFile::modeNoTruncate | CFile::modeWrite | CFile::typeBinary))
{
// To do something
}
file.Close();
主なモードを以下に記載する。
モード名 | 説明 |
---|---|
CFile::modeCreate | ファイルを新規に作成する。 既にファイルがある場合は、削除して新規に作成する。 |
CFile::modeNoTruncate | modeCreateと組み合わせて使用する場合、 既にファイルがある場合は新規作成せずに開く。 |
CFile::modeRead | ファイルを読み取り専用で開く。 |
CFile::modeReadWrite | ファイルを読み書き可能で開く。 |
CFile::modeWrite | ファイルを書き込み専用で開く。 |
CFile::shareDenyNone | 他プロセスからも読み書きできる状態でファイルを開く。 |
CFile::shareExclusive | ファイルを排他モードで開く。 |
CFile::typeText | テキストモードを設定する。 派生クラスで使用する。 |
CFile::typeBinary | バイナリモードを設定する。 派生クラスで使用する。 |
1行ずつ読み込む
CStdioFile File(_T("test.dat"), CFile::modeCreate| CFile::modeNoTruncate | CFile::modeRead | CFile::typeText);
CString strReadLine = _T("");
while(File.ReadString(strReadLine))
{
TRACE(strReadLine + _T("\n"));
}
ファイルに書き込む
CStdioFile File(_T("test.dat"), CFile::modeCreate| CFile::modeNoTruncate | CFile::modeWrite | CFile::typeText);
CString strWriteLine1 = _T("hoge\n");
File.WriteString(strWriteLine1);
CString strWriteLine2 = _T("piyo\n");
File.WriteString(strWriteLine2);
File.Close();
ファイルに追記する
CFileおよびCStdioFileには追記モードが存在しないので、ファイルを開いた後、書き込み位置を指定する必要がある。 下記のサンプルコードでは、ファイルを書き込みモードで開いた後、SeekToEndメソッドで書き込み位置を最後尾に移動する。
CStdioFile File(_T("test.dat"), CFile::modeCreate| CFile::modeNoTruncate | CFile::modeWrite | CFile::typeText);
File.SeekToEnd(); // 書き込み位置を最後尾に移動
CString strWriteLine1 = _T("hoge\n");
File.WriteString(strWriteLine1); // Write a line
CString strWriteLine2 = _T("piyo\n");
File.WriteString(strWriteLine2); // Write a line
File.Close();
ファイルを削除する
// 単一のファイルを削除する
CFile::Remove(_T("C:\\test.txt")); // Cドライブ直下のtest.txtファイルを削除する
// 複数のファイルやディレクトリを削除する
CString strRemoveDirPath = _T("C:\\test?");
strRemoveDirPath.SetAt(strRemoveDirPath.GetLength() - 1, 0);
SHFILEOPSTRUCT drive = {};
drive.hwnd = this->m_hWnd; // ウィンドウハンドル
drive.wFunc = FO_DELETE; // 実行する操作
drive.pFrom = strRemoveDirPath; // 対象ファイル名
drive.pTo = NULL; // 目的ファイル名
drive.fFlags = FOF_ALLOWUNDO; // フラグ
SHFileOperation(&drive);
wFuncは、下記に示す通り、実行する操作を指定する。
命令マクロ | 説明 |
---|---|
FO_MOVE | pFromをpToの位置に移動 |
FO_COPY | pFromをpToの位置にコピー |
FO_DELETE | Fromを削除 |
FO_RENAME | pFromをpToに変更 |
pFromにはディレクトリおよびファイルを指定する。ワイルドカードも使用できる。
また、NULL文字(\0)で区切ると複数指定できる。
fFlagは、下記に示す通り、動作時のフラグを指定する。
命令マクロ | 説明 |
---|---|
FOF_SILENT | 経過を表すダイアログボックス非表示 |
FOF_ALLOWUNDO | 削除の場合はゴミ箱に移動 |
FOF_NOERRORUI | エラーが発生した場合はUI非表示 |
FOF_NOCONFIRMATION | 表示されるダイアログボックスで『はい』または『すべて』を選択する |
ファイルの再帰検索
以下の例では、指定したディレクトリに存在する全てのファイルを再帰検索している。
// 関数内で自分自身を呼び出す再帰関数を作る
void CSampleView::SerchFiles(CString Path)
{
// ファイルの検索
CFileFind Finder;
Path += _T("\\*.*");
BOOL bWorking = Finder.FindFile(Path, 0);
while(bWorking)
{
bWorking = Finder.FindNextFile();
CString Getpath = Finder.GetFilePath();
CString Getname = Finder.GetFileName();
// 再帰的にディレクトリアイテムを作成
if(!(GetFileAttributes(Getpath) & FILE_ATTRIBUTE_DIRECTORY))
{ // ファイルの場合
}
else
{
if(Getname != _T(".") && Getname != _T(".."))
{ // ディレクトリの場合
SerchFiles(Getpath);
}
}
}
}
例えば、以下のようにSerchFilesメソッドを呼べば、次のようにDドライブの内容を全て書き出す。
SerchFiles(_T("D:\\"))