MFCの基礎 - ファイル
提供: MochiuWiki : SUSE, EC, PCB
ファイルを開く
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:\\"))