FileSystem


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 );