(同じ利用者による、間の4版が非表示)
1行目: 1行目:
== ファイルを開く ==
== ファイルを開く ==
<code>CFile</code>クラスの<code>Open</code>メソッドは、第1引数はファイル名、第2引数はファイルモードを指定する。<br>
<code>CFile</code> クラスの <code>Open</code> メソッドは、第1引数はファイル名、第2引数はファイルモードを指定する。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  CFile File;
  CFile File;
11行目: 11行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
主なモードを以下に記載する。<br>
<center>
<center>
{| class="wikitable" style="background-color:#fefefe;"
{| class="wikitable"  
|+ CFileクラスのファイルモード
|-
|-
! style="background-color:#00ffff;" | モード名  
! モード名 !! 説明
! style="background-color:#00ffff;" | 説明
|-
|-
| CFile::modeCreate || ファイルを新規に作成する。<br>既にファイルがある場合は、削除して新規に作成する。
| CFile::modeCreate || ファイルを新規に作成する。<br>既にファイルがある場合は、削除して新規に作成する。
64行目: 63行目:


== ファイルに追記する ==
== ファイルに追記する ==
CFileおよびCStdioFileには追記モードが存在しないので、ファイルを開いた後、書き込み位置を指定する必要がある。
CFileクラスおよびCStdioFileクラスには追記モードが存在しないため、ファイルを開いた後に書き込み位置を指定する必要がある。<br>
下記のサンプルコードでは、ファイルを書き込みモードで開いた後、SeekToEndメソッドで書き込み位置を最後尾に移動する。
<br>
以下の例では、ファイルを書き込みモードで開いた後、SeekToEndメソッドで書き込み位置を最後尾に移動している。<br>
  <syntaxhighlight 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);
100行目: 100行目:
  SHFileOperation(&drive);
  SHFileOperation(&drive);
  </syntaxhighlight>
  </syntaxhighlight>
wFuncは、下記に示す通り、実行する操作を指定する。<br>
<br>
下表に、wFuncの実行操作を示す。<br>
<center>
<center>
{| class="wikitable" style="background-color:#fefefe;"
{| class="wikitable"  
|+ wFuncに指定できる実行操作
|-
|-
! style="background-color:#00ffff;" | 命令マクロ  
! 命令マクロ !! 説明
! style="background-color:#00ffff;" | 説明
|-
|-
| FO_MOVE || pFromをpToの位置に移動
| FO_MOVE || pFromをpToの位置に移動
116行目: 117行目:
|}
|}
</center>
</center>
<br>
pFromにはディレクトリおよびファイルを指定する。ワイルドカードも使用できる。<br>
pFromにはディレクトリおよびファイルを指定する。ワイルドカードも使用できる。<br>
また、NULL文字(\0)で区切ると複数指定できる。<br>
また、NULL文字(\0)で区切ると複数指定できる。<br>
<br>
<br>
fFlagは、下記に示す通り、動作時のフラグを指定する。<br>
下表に、fFlagの動作フラグを示す。<br>
<br>
<center>
<center>
{| class="wikitable" style="background-color:#fefefe;"
{| class="wikitable"  
|+ fFlagの動作フラグ
|-
|-
! style="background-color:#00ffff;" | 命令マクロ  
! 命令マクロ !! 説明
! style="background-color:#00ffff;" | 説明
|-
|-
| FOF_SILENT || 経過を表すダイアログボックス非表示
| FOF_SILENT || 経過を表すダイアログボックス非表示
141行目: 144行目:
  // ファイルのコピー
  // ファイルのコピー
  BOOL CopyFile(
  BOOL CopyFile(
                LPCTSTR     lpExistingFileName,  // コピー元のファイルのパス
    LPCTSTR lpExistingFileName,  // コピー元のファイルのパス
                LPCTSTR     lpNewFileName,      // コピー先のファイルのパス
    LPCTSTR lpNewFileName,      // コピー先のファイルのパス
                BOOL       bFailIfExists        // 上書き許可 / 不許可
    BOOL   bFailIfExists        // 上書き許可 / 不許可
  );
  );
   
   
  // ファイルの移動・ファイル名の変更
  // ファイルの移動・ファイル名の変更
  BOOL MoveFile(
  BOOL MoveFile(
                LPCTSTR     lpExistingFileName,  // 移動元のファイルのパス
    LPCTSTR lpExistingFileName,  // 移動元のファイルのパス
                LPCTSTR     lpNewFileName        // 移動後のファイルのパス
    LPCTSTR lpNewFileName        // 移動後のファイルのパス
  );
  );
   
   
  // ファイルの削除
  // ファイルの削除
  BOOL DeleteFile(
  BOOL DeleteFile(
                  LPCTSTR     lpFileName  // 削除するファイルのパス
    LPCTSTR lpFileName  // 削除するファイルのパス
  );
  );
  </syntaxhighlight>
  </syntaxhighlight>
163行目: 166行目:
  // ファイルおよびディレクトリの属性の取得
  // ファイルおよびディレクトリの属性の取得
  DWORD GetFileAttributes(
  DWORD GetFileAttributes(
                          LPCTSTR   lpFileName  // ファイルのパス
    LPCTSTR lpFileName  // ファイルのパス
  );
  );
   
   
  // ファイルおよびディレクトリの属性の設定
  // ファイルおよびディレクトリの属性の設定
  BOOL SetFileAttributes(
  BOOL SetFileAttributes(
                          LPCTSTR   lpFileName,  // ファイルのパス
    LPCTSTR lpFileName,  // ファイルのパス
                          DWORD     dwAttributes  // 属性フラグ
    DWORD   dwAttributes  // 属性フラグ
  );
  );
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
<center>
<center>
{| class="wikitable" style="background-color:#fefefe;"
{| class="wikitable"  
|+ 属性の定数
|+ 属性の定数
|-
|-
! style="background-color:#66CCFF;" | 定数  
! 定数 !! 意味
! style="background-color:#66CCFF;" | 意味
|-
|-
| FILE_ATTRIBUTE_NORMAL || 特に属性なし
| FILE_ATTRIBUTE_NORMAL || 特に属性なし
194行目: 196行目:
</center>
</center>
<br>
<br>
<code>FILE_ATTRIBUTE_NORMAL</code>属性は、他の属性定数と組み合わせて使用できない。<br>
<code>FILE_ATTRIBUTE_NORMAL</code> 属性は、他の属性定数と組み合わせて使用できない。<br>
<code>FILE_ATTRIBUTE_DIRECTORY</code>属性は、属性を指定しても設定できない。<br>
<code>FILE_ATTRIBUTE_DIRECTORY</code> 属性は、属性を指定しても設定できない。<br>
<br><br>
<br><br>


201行目: 203行目:
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  DWORD GetFileType(
  DWORD GetFileType(
                    HANDLE  hFile  // ファイルのハンドル
    HANDLE  hFile  // ファイルのハンドル
  );
  );
  </syntaxhighlight>
  </syntaxhighlight>
354行目: 356行目:
== タイムスタンプの取得 / 設定 ==
== タイムスタンプの取得 / 設定 ==
==== タイムスタンプの取得 ====
==== タイムスタンプの取得 ====
この関数群は、ディレクトリも同様に操作できる。<br>
この関数群は、ディレクトリも同様にタイムスタンプを取得できる。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  // タイムスタンプの取得
  // タイムスタンプの取得
  BOOL GetFileTime(
  BOOL GetFileTime(
                    HANDLE       hFile,            // ファイルのハンドル
    HANDLE     hFile,            // ファイルのハンドル
                    LPFILETIME   lpCreationTime,    // 作成日時
    LPFILETIME lpCreationTime,    // 作成日時
                    LPFILETIME   lpLastAccessTime,  // 最終アクセス日時
    LPFILETIME lpLastAccessTime,  // 最終アクセス日時
                    LPFILETIME   lpLastWriteTime    // 最終更新日時
    LPFILETIME lpLastWriteTime    // 最終更新日時
  );
  );
   
   
  // タイムスタンプからローカル時間に変換
  // タイムスタンプからローカル時間に変換
  BOOL FileTimeToLocalFileTime(
  BOOL FileTimeToLocalFileTime(
                                CONST FILETIME*   lpFileTime,     // 世界標準時間のファイル時刻
    CONST FILETIME *lpFileTime,     // 世界標準時間のファイル時刻
                                LPFILETIME       lpLocalFileTime  // ローカル時間のファイル時刻
    LPFILETIME     lpLocalFileTime  // ローカル時間のファイル時刻
  );
  );
   
   
  // タイムスタンプからシステム時間に変換
  // タイムスタンプからシステム時間に変換
  BOOL FileTimeToSystemTime(
  BOOL FileTimeToSystemTime(
                            CONST FILETIME*   lpFileTime,   // 変換前のファイル時刻
    CONST FILETIME *lpFileTime, // 変換前のファイル時刻
                            LPSYSTEMTIME     lpSystemTime  // 変換後のシステム日時
    LPSYSTEMTIME   lpSystemTime  // 変換後のシステム日時
  );
  );
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
FILETIME構造体およびSYSTEMTIME構造体を、以下に示す。<br>
<code>FILETIME</code>構造体および<code>SYSTEMTIME</code>構造体を、以下に示す。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  typedef struct _FILETIME {
  typedef struct _FILETIME {
427行目: 429行目:
         st1.wMilliseconds      // ミリ秒(0-999)
         st1.wMilliseconds      // ミリ秒(0-999)
  );
  );
</syntaxhighlight>
<br>
==== タイムスタンプの設定 ====
この関数群は、ディレクトリも同様にタイムスタンプを設定できる。<br>
<br>
<syntaxhighlight lang="c++">
// システム時間からファイル日時に変換
BOOL SetFileTime(
                    HANDLE            hFile,            // ファイルのハンドル
                    CONST FILETIME*  lpCreationTime,    // 作成日時
                    CONST FILETIME*  lpLastAccessTime,  // 最終アクセス日時
                    CONST FILETIME*  lpLastWriteTime    // 最終更新日時
);
// ローカル時間からファイル日時に変換
BOOL LocalFileTimeToFileTime(
                                CONST FILETIME*  lpLocalFileTime,  // ローカル時間のファイル時刻
                                LPFILETIME        lpFileTime        // 世界標準時間のファイル時刻
);
// ファイル日時の設定
BOOL SystemTimeToFileTime(
                            CONST SYSTEMTIME*  lpSystemTime,  // 変換前のシステム日時
                            LPFILETIME          lpFileTime    // 変換後のファイル時刻
);
</syntaxhighlight>
<br>
FILETIME構造体およびSYSTEMTIME構造体を、以下に示す。<br>
<syntaxhighlight lang="c++">
typedef struct _FILETIME {
    DWORD  dwLowDateTime;      // 下位32ビット
    DWORD  dwHighDateTime;    // 上位32ビット
} FILETIME, *PFILETIME;
typedef struct _SYSTEMTIME {
    WORD    wYear;              // 年(1901~)
    WORD    wMonth;            // 月(1-12)
    WORD    wDayOfWeek;        // 曜日(0-6)
    WORD    wDay;              // 日(1-31)
    WORD    wHour;              // 時(0-23)
    WORD    wMinute;            // 分(0-59)
    WORD    wSecond;            // 秒(0-59)
    WORD    wMilliseconds;      // ミリ秒(0-999)
} SYSTEMTIME, *PSYSTEMTIME;
</syntaxhighlight>
<br>
以下の例では、変数hFileにファイルのハンドルを指定して、タイムスタンプを設定している。<br>
ディレクトリの場合は、<code>FILE_FLAG_BACKUP_SEMANTICS</code>フラグを指定する。<br>
<u>このフラグを指定しない場合、正常に処理できないことに注意する。</u><br>
<syntaxhighlight lang="c++">
FILETIME    ft1, ft2, ft3;      // ファイル時刻
FILETIME    lt1, lt2, lt3;      // ローカル時刻
SYSTEMTIME  st1, st2, st3;      // システム日時
// 現在の日時を構造体にセット
GetLocalTime(&st1);
GetLocalTime(&st2);
GetLocalTime(&st3);
// システム日時からローカル時刻に変換
SystemTimeToFileTime(&st1, &lt1);        // 作成日時
SystemTimeToFileTime(&st2, &lt2);        // 最終アクセス日時
SystemTimeToFileTime(&st3, &lt3);        // 最終更新日時
// ローカル時刻からファイル時刻に変換
LocalFileTimeToFileTime(&lt1, &ft1);      // 作成日時
LocalFileTimeToFileTime(&lt2, &ft2);      // 最終アクセス日時
LocalFileTimeToFileTime(&lt3, &ft3);      // 最終更新日時
// ファイル日時の設定
SetFileTime(hFile, &ft1, &ft2, &ft3);
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>
434行目: 508行目:
  // 最初のファイルを検索
  // 最初のファイルを検索
  HANDLE FindFirstFile(
  HANDLE FindFirstFile(
                        LPCTSTR             lpFileName,    // ファイルのパス
    LPCTSTR           lpFileName,    // ファイルのパス
                        LPWIN32_FIND_DATA   lpFindFileData  // データバッファ
    LPWIN32_FIND_DATA lpFindFileData  // データバッファ
  );
  );
   
   
  // 次のファイルを検索
  // 次のファイルを検索
  BOOL FindNextFile(
  BOOL FindNextFile(
                    HANDLE              hFindFile,      // 検索ハンドル
    HANDLE              hFindFile,      // 検索ハンドル
                    LPWIN32_FIND_DATA  lpFindFileData  // データバッファ
    LPWIN32_FIND_DATA  lpFindFileData  // データバッファ
  );
  );
   
   
  // ファイル検索を終了する
  // ファイル検索を終了する
  BOOL FindClose(
  BOOL FindClose(
                  HANDLE  hFindFile  // 検索ハンドル
    HANDLE  hFindFile  // 検索ハンドル
  );
  );
  </syntaxhighlight>
  </syntaxhighlight>
474行目: 548行目:
     HANDLE          hFind;
     HANDLE          hFind;
   
   
     if((hFind = FindFirstFile(TEXT("*.*"),&fdFile)) != INVALID_HANDLE_VALUE)
     if((hFind = FindFirstFile(TEXT("*.*"),&fdFile)) != INVALID_HANDLE_VALUE) {
    {
       do
       do
       {
       {
           if(fdFile.cFileName[0] != TEXT('.') || fdFile.cFileName[0] != TEXT('..'))
           if(fdFile.cFileName[0] != TEXT('.') || fdFile.cFileName[0] != TEXT('..')) {
          {
             if(fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
             if(fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                // fdFile.cFileNameにディレクトリ名
            {  // fdFile.cFileNameにディレクトリ名
             }
             }
             else
             else {
            {  // fdFile.cFileNameにファイル名
                // fdFile.cFileNameにファイル名
             }
             }
           }
           }
       }while(FindNextFile(hFind, &fdFile));
       } while(FindNextFile(hFind, &fdFile));
   
   
       FindClose(hFind);
       FindClose(hFind);