「MFCの基礎 - ファイル」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(Wiki がページ「CFileとCStdioFileの使い方」を「MFCの基礎 - ファイル」に、リダイレクトを残さずに移動しました)
編集の要約なし
1行目: 1行目:
== ファイルを開く ==
== ファイルを開く ==
  <source lang="c++">
<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();
  </source>
  </syntaxhighlight>
第1引数はファイル名、第2引数はファイルモードを指定する。<br>
<br>
主なモードを以下に記載する。<br>
主なモードを以下に記載する。<br>
CFile::modeCreate       ファイルを新規に作成する。既にファイルがある場合も削除して新規に作成する。<br>
<center>
CFile::modeNoTruncate   modeCreateと組み合わせて使用すると既にファイルがある場合は新規作成せずに開く。<br>
{| class="wikitable" style="background-color:#fefefe;"
CFile::modeRead         ファイルを読み取り専用で開く。<br>
|-
CFile::modeReadWrite ファイルを読み書き可能で開く。<br>
! style="background-color:#00ffff;" | モード名
CFile::modeWrite ファイルを書き込み専用で開く。<br>
! style="background-color:#00ffff;" | 説明
CFile::shareDenyNone 他プロセスからも読み書きできる状態でファイルを開く。<br>
|-
CFile::shareExclusive ファイルを排他モードで開く。<br>
| CFile::modeCreate || ファイルを新規に作成する。<br>既にファイルがある場合は、削除して新規に作成する。
CFile::typeText         テキストモードを設定する。派生クラスで使う。<br>
|-
CFile::typeBinary バイナリモードを設定する。派生クラスで使う。<br>
| 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行ずつ読み込む ==
  <source lang="c++">
  <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"));
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== ファイルに書き込む ==
== ファイルに書き込む ==
  <source lang="c++">
  <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();
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


49行目: 66行目:
CFileおよびCStdioFileには追記モードが存在しないので、ファイルを開いた後、書き込み位置を指定する必要がある。
CFileおよびCStdioFileには追記モードが存在しないので、ファイルを開いた後、書き込み位置を指定する必要がある。
下記のサンプルコードでは、ファイルを書き込みモードで開いた後、SeekToEndメソッドで書き込み位置を最後尾に移動する。
下記のサンプルコードでは、ファイルを書き込みモードで開いた後、SeekToEndメソッドで書き込み位置を最後尾に移動する。
  <source lang="c++">
  <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();
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== ファイルを削除する ==
== ファイルを削除する ==
  <source lang="c++">
  <syntaxhighlight lang="c++">
  // 単一のファイルを削除する
  // 単一のファイルを削除する
  CFile::Remove(_T("C:\\test.txt"));  // Cドライブ直下のtest.txtファイルを削除する
  CFile::Remove(_T("C:\\test.txt"));  // Cドライブ直下のtest.txtファイルを削除する
  </source>
  </syntaxhighlight>
<br>
<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  // 複数のファイルやディレクトリを削除する
  // 複数のファイルやディレクトリを削除する
  CString strRemoveDirPath = _T("C:\\test?");
  CString strRemoveDirPath = _T("C:\\test?");
82行目: 99行目:
   
   
  SHFileOperation(&drive);
  SHFileOperation(&drive);
  </source>
  </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:\\"))