MFCの基礎 - ファイル

提供:MochiuWiki : SUSE, EC, PCB
2021年1月29日 (金) 16:32時点におけるWiki (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

ファイルを開く

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:\\"))