POINT
Win32API は GUI を提供するのが Main だが
OS 本体の機能も提供する
( Directory Entry の検索 )
GetOpenFileName(); GetSaveFileName(); を利用する
( fopen, fread, fwrite とかでも代用可能 )
DESC
listbox の使いどころは, file の列挙( default でこの機能をサポートしている )
Exe のある directory のみが注意
msg
LB_DIR ( これ Event|Condition の ID みたいだな... )
wp
表示ファイルの属性( DDL_DIRECTORY | DDL_READWRITE )
lp
file 名( wildcard OK * )
■ ReadFile
SYNTAX
bool ReadFile(
HANDLE hFile,
LPVOID buf,
DWORD sz, // 読み込むサイズ
LPDWORD szRead, // 読んだサイズ
LPOVERLAPPED p // OVERLAPPED ptr
);
RET
!0 : SUCCESS
0 : FAIL
DESC
fread() のように stream タイプ
読んだ分だけ 前に進む
char buf[1024];
DWORD szRead;
ReadFile( hFile, buf, sz, &szRead, 0 );
// 必ず閉じること. アクセス権限をとられるらしい
CloseHandle( hFile );
■ ファイルの時間を調べる
■ GetFileTime
SYNTAX
BOOL GetFileTime(
HANDLE hFile, // ファイルのハンドル
LPFILETIME lpCreationTime, // 作成日時
LPFILETIME lpLastAccessTime, // 最終アクセス日時
LPFILETIME lpLastWriteTime // 最終更新日時
);
// 不要な情報は 0 をセットする
// 書き込みをしたら W.r.i.t.e.Time が更新される
FILETIME time;
GetFileTime( hFile, 0, 0, &time );
■ CompareFileTime
// 比較する
// ret = ( file1 - file2 ) と考えるとわかりやすい
LONG ret = CompareFileTime( file1, file2 );
■ File に保存する
CreateFile();
WriteFile();
ReadFile();
CloseHandle();
SYNTAX
HANDLE CreateFile(
LPCTSTR file,
DWORD modeAcc, // AccessMode 0 : file情報のみ取得 GENERIC_READ | GENERIC_WRITE
DWORD modeShr, // 共有 mode
LPSECURITY_ATTRIBUTE s,
DWORD flagCreate, // 生成条件 (CREATE_NEW | CREATE_ALWAYS | OPEN_EXISTING | OPEN_ALWAYS )
DWORD flag,
HANDLE file
);
HANDLE hFile = CreateFile(
str, // Path
GENERIC_READ,
0,
NULL,
//OPEN_ALWAYS, // ない場合は空ファイルができる
OPEN_EXISTING, // INVALID_HANDLE_VALUE をかえす
FILE_ATTRIBUTE_NORMAL,
0
);
]
■ Directory.検索
■ FindFirstFile
SYNTAX
HANDLE FindFirstFile(
LPCTSTR file, // 検索 path
LPWIN32_FIND_DATA y // 結果
);
RET
!0 : SUCCESS
0 : ERR
DESC
指定 ptn と一致する file(directory) Handle を取得する.
file 名は [*?] 使用 OK
HANDLE h = FindFirstFile("D:/data/*", &wfd );
WARNING
BAD
HANDLE h = FindFirstFile("D:/data", &wfd );
OD
HANDLE h = FindFirstFile("D:/data/*", &wfd );
HANDLE h = FindFirstFile( ".\tmp\data", &wfd );
if ( h == INVALID_HANDLE_VALUE ) {
myas(0, "");
}
struct WIN32_FIND_DATA {
// FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_DIRECTORY ...
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
TCHAR cFileName[ MAX_PATH ];
TCHAR cAlternateFileName[ 14 ];
};
■ FindNextFile
SYNTAX
HANDLE FindNextFile(
HANDLE h,
LPWIN32_FIND_DATA y
);
RET
!0 : SUCCESS
0 : ERR
// Directory を iterate する
while ( FindNextFile(h, &i) ) {
if ( y.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {
}
printf( y.cFileName );
sz += y.nFileSizeLow;
}
■ FindClose
SYNTAX
BOOL FindClose( HANDLE h );
DESC
不要になった HANDLE を削除
WARNING
CloseHandle( h ) と間違えないでね
■ GetCurrentDirectory
SYNTAX
GetCurrentDirectory(
int, // buf size ( 文字数( TCHAR )単位 )
LPTSTR // buf ( FULLPATH でかえる )
);
■ GetFileInformationByHandle
SYNTAX
GetFileInformationByHandle( HANDLE, BY_HANDLE_FILE_INFORMATION );
DESC
File に関連する情報をえる
File Size をもとめて ReadFile() の Buffer を用意するために使う
GetFileInformationByHandle( h, &i );
i.nFileSizeLow;
]
■ パスの存在チェック
#pragma comment(lib,"Shlwapi.lib")
#include< Shlwapi.h>
BOOL PathFileExists(
LPCTSTR path
);