| (同じ利用者による、間の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> | ||
<center> | <center> | ||
{| class="wikitable" | {| class="wikitable" | ||
|+ CFileクラスのファイルモード | |||
|- | |- | ||
! | ! モード名 !! 説明 | ||
! | |||
|- | |- | ||
| CFile::modeCreate || ファイルを新規に作成する。<br>既にファイルがある場合は、削除して新規に作成する。 | | CFile::modeCreate || ファイルを新規に作成する。<br>既にファイルがある場合は、削除して新規に作成する。 | ||
| 64行目: | 63行目: | ||
== ファイルに追記する == | == ファイルに追記する == | ||
CFileクラスおよびCStdioFileクラスには追記モードが存在しないため、ファイルを開いた後に書き込み位置を指定する必要がある。<br> | |||
<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> | ||
<br> | |||
下表に、wFuncの実行操作を示す。<br> | |||
<center> | <center> | ||
{| class="wikitable" | {| class="wikitable" | ||
|+ wFuncに指定できる実行操作 | |||
|- | |- | ||
! | ! 命令マクロ !! 説明 | ||
! | |||
|- | |- | ||
| 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> | |||
<br> | |||
<center> | <center> | ||
{| class="wikitable" | {| class="wikitable" | ||
|+ fFlagの動作フラグ | |||
|- | |- | ||
! | ! 命令マクロ !! 説明 | ||
! | |||
|- | |- | ||
| FOF_SILENT || 経過を表すダイアログボックス非表示 | | FOF_SILENT || 経過を表すダイアログボックス非表示 | ||
| 141行目: | 144行目: | ||
// ファイルのコピー | // ファイルのコピー | ||
BOOL CopyFile( | BOOL CopyFile( | ||
LPCTSTR lpExistingFileName, // コピー元のファイルのパス | |||
LPCTSTR lpNewFileName, // コピー先のファイルのパス | |||
BOOL bFailIfExists // 上書き許可 / 不許可 | |||
); | ); | ||
// ファイルの移動・ファイル名の変更 | // ファイルの移動・ファイル名の変更 | ||
BOOL MoveFile( | BOOL MoveFile( | ||
LPCTSTR lpExistingFileName, // 移動元のファイルのパス | |||
LPCTSTR lpNewFileName // 移動後のファイルのパス | |||
); | ); | ||
// ファイルの削除 | // ファイルの削除 | ||
BOOL DeleteFile( | BOOL DeleteFile( | ||
LPCTSTR lpFileName // 削除するファイルのパス | |||
); | ); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| 163行目: | 166行目: | ||
// ファイルおよびディレクトリの属性の取得 | // ファイルおよびディレクトリの属性の取得 | ||
DWORD GetFileAttributes( | DWORD GetFileAttributes( | ||
LPCTSTR lpFileName // ファイルのパス | |||
); | ); | ||
// ファイルおよびディレクトリの属性の設定 | // ファイルおよびディレクトリの属性の設定 | ||
BOOL SetFileAttributes( | BOOL SetFileAttributes( | ||
LPCTSTR lpFileName, // ファイルのパス | |||
DWORD dwAttributes // 属性フラグ | |||
); | ); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
<center> | <center> | ||
{| class="wikitable | {| class="wikitable" | ||
|+ 属性の定数 | |+ 属性の定数 | ||
|- | |- | ||
! | ! 定数 !! 意味 | ||
! | |||
|- | |- | ||
| 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 // ファイルのハンドル | |||
); | ); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| 354行目: | 356行目: | ||
== タイムスタンプの取得 / 設定 == | == タイムスタンプの取得 / 設定 == | ||
==== タイムスタンプの取得 ==== | ==== タイムスタンプの取得 ==== | ||
この関数群は、ディレクトリも同様にタイムスタンプを取得できる。<br> | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
// タイムスタンプの取得 | // タイムスタンプの取得 | ||
BOOL GetFileTime( | BOOL GetFileTime( | ||
HANDLE hFile, // ファイルのハンドル | |||
LPFILETIME lpCreationTime, // 作成日時 | |||
LPFILETIME lpLastAccessTime, // 最終アクセス日時 | |||
LPFILETIME lpLastWriteTime // 最終更新日時 | |||
); | ); | ||
// タイムスタンプからローカル時間に変換 | // タイムスタンプからローカル時間に変換 | ||
BOOL FileTimeToLocalFileTime( | BOOL FileTimeToLocalFileTime( | ||
CONST FILETIME *lpFileTime, // 世界標準時間のファイル時刻 | |||
LPFILETIME lpLocalFileTime // ローカル時間のファイル時刻 | |||
); | ); | ||
// タイムスタンプからシステム時間に変換 | // タイムスタンプからシステム時間に変換 | ||
BOOL FileTimeToSystemTime( | BOOL FileTimeToSystemTime( | ||
CONST FILETIME *lpFileTime, // 変換前のファイル時刻 | |||
LPSYSTEMTIME lpSystemTime // 変換後のシステム日時 | |||
); | ); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <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, <1); // 作成日時 | |||
SystemTimeToFileTime(&st2, <2); // 最終アクセス日時 | |||
SystemTimeToFileTime(&st3, <3); // 最終更新日時 | |||
// ローカル時刻からファイル時刻に変換 | |||
LocalFileTimeToFileTime(<1, &ft1); // 作成日時 | |||
LocalFileTimeToFileTime(<2, &ft2); // 最終アクセス日時 | |||
LocalFileTimeToFileTime(<3, &ft3); // 最終更新日時 | |||
// ファイル日時の設定 | |||
SetFileTime(hFile, &ft1, &ft2, &ft3); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 434行目: | 508行目: | ||
// 最初のファイルを検索 | // 最初のファイルを検索 | ||
HANDLE FindFirstFile( | HANDLE FindFirstFile( | ||
LPCTSTR lpFileName, // ファイルのパス | |||
LPWIN32_FIND_DATA lpFindFileData // データバッファ | |||
); | ); | ||
// 次のファイルを検索 | // 次のファイルを検索 | ||
BOOL FindNextFile( | BOOL FindNextFile( | ||
HANDLE hFindFile, // 検索ハンドル | |||
LPWIN32_FIND_DATA lpFindFileData // データバッファ | |||
); | ); | ||
// ファイル検索を終了する | // ファイル検索を終了する | ||
BOOL FindClose( | BOOL FindClose( | ||
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にディレクトリ名 | ||
} | } | ||
else | else { | ||
// fdFile.cFileNameにファイル名 | |||
} | } | ||
} | } | ||
}while(FindNextFile(hFind, &fdFile)); | } while(FindNextFile(hFind, &fdFile)); | ||
FindClose(hFind); | FindClose(hFind); | ||