|
■■■■■■■■■■■■■■■■■■■■■■■■@■■■■■■.■■■■ =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-// PR//-=-= 「美味しいんですかね・・・赤いメロンって?」「食べた人に聞いてみよ。」 ▽ ▽ ▽ 【みんなの声で、あなたのベストを新発見】 ▲▲買う前に読むべし! あの品この品、体験レポート共有サイト!▲▲ http://www.echelp.net/ =-=-//000240-00637//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= ■■■■■■■■■■■■■■■■■■■■■■■■@■■■■■■.■■■■ 発行部数:MagMag 2345 Pubzine 306 カプライト215 Melten 39 E-Magazine 53 ここでメール 149 Macky 164 Melma 224 総発行部数:3500 ▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼△▼ ------------------------------------------------------------ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ■CからはじめるWindowsDirectXへの道 ■ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ホーム:<http://www.geocities.co.jp/SiliconValley-Bay/3125> ┌─────────────────────────────┐ ■第2章 ファイル操作( ファイル 編) └─────────────────────────────┘ さて、Windows18回2部 説明を行っていきます。 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● ファイル操作 ● 今回は、ファイル操作 について触れていきます. 関数などの説明は、サンプルのあとに乗せていきます。 ┌─────────────────────────────┐ ┌─────────────────────────────┐ ─────────────────────────────── メインヘッダーファイル ─────────────────────────────── #include"MCFile.h" ─────────────────────────────── 今回は、クラスの利用のため自作のMCFile.hをインクルードしています。 今回は、クラスの使い方なので、クラスのみの説明をします. ┌─────────────────────────────┐ さて、ここからが一番重要な部分です。 注意点として、今回は、すべてPUBLICにしていますが、 メソッドや内部の処理の隠滅を行いたいときには、 それぞれの役割を考えてクラスを組んで下さい。 ここで、少し関数などもそうですが、コメントの入れる場合の 説明をします。 まず、メソッド名、引数、戻り値、作者、作成日付 は、最低でも必要です。 さらに、わかりやすくするには、注意事項や使用法を 明記すると良いでしょう。 また、C++では、”// ”と関数の前に入れてコメントを いれることにより、そのコメント内のものを表示させる ことができます。 クラス名.←のあとに表示される右側のあれです. 説明では、コメントは削除しています. ─────────────────────────────── ┌─────────────────────────────┐ ┌─────────────────────────────┐ ■ クラスファイル <ソースファイル>■ ┌─────────────────────────────┐ #include"MCFile.h" void MCFile::FileOpen(LPTSTR lpFileName) { hFile=CreateFile(lpFileName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL); if (hFile==INVALID_HANDLE_VALUE) return; } ─────────────────────────────── ファイルを読み書き両用で開き、もしファイルハンドルが得られなかった場合、 終了しています. ─────────────────────────────── 関数説明 CreateFile 使ったフラグの説明のみ説明をします. それ以外については、MSDNをご参照ください. GENERIC_READ ファイルを読み込み専用に開きます. GENERIC_WRITE ファイルを書き込み専用に開きます. OPEN_ALWAYS ファイルをオープンします。 指定ファイルが存在していない場合、関数は新しいファイルを作成します。 FILE_ATTRIBUTE_NORMAL とくに属性はありません。単独で指定します。 関数が失敗すると、INVALID_HANDLE_VALUE が返ります。 ─────────────────────────────── void MCFile::FileRead(CHAR* lpBuff) { DWORD dwRead; SetFilePointer(hFile,0,NULL,FILE_BEGIN); ReadFile(hFile,lpBuff,strlen(lpBuff)+1,&dwRead,NULL); } ─────────────────────────────── まず、ファイルの先頭に移動しています. 次に、指定したファイルからデータを読み取っています。 ─────────────────────────────── SetFilePointer ファイルポインタを移動します。 DWORD SetFilePointer( HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod ); パラメータ hFile ファイルのハンドルを指定します。 このハンドルは、GENERIC_READ または GENERIC_WRITE アクセスを 持っていなければなりません。 lDistanceToMove 新しいファイルポインタの位置を、オフセットで指定します。 正の値を指定すると順方向に、負の値を指定すると逆方向に移動します。 lpDistanceToMoveHigh オフセットの上位 32 ビットが入った LONG 型変数へのポインタを指定します。 関数が成功すると、この変数にファイルポインタの新しい位置の上位ダブルワードが格納されます。 このパラメータに有効なポインタを指定すると (2^64)-2 バイトまでのファイルが操作できますが、 NULL を指定すると (2^32)-2 バイトまでのファイルしか操作できません。 dwMoveMethod ファイルポインタ移動の開始点を指定します。 次の値のいずれかを指定します。 値 意味 FILE_BEGIN ファイルの先頭を開始点にします。 FILE_CURRENT ファイルポインタの現在位置を開始点にします。 FILE_END ファイルの終端を開始点にします ─────────────────────────────── ReadFile ファイルからデータを読み取ります。 ファイルポインタの現在位置が、読み取りの開始位置になります。 読み取りが終了すると、ファイルポインタの位置は、 読み取ったバイト数だけ進められます。 BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ); パラメータ hFile ファイルのハンドルを指定します。このハンドルは、GENERIC_READ アクセスを 持っていなければなりません。 lpBuffer バッファへのポインタを指定します。このバッファに、ファイルから 読み取ったデータが格納されます。 nNumberOfBytesToRead 読み取るバイト数を指定します。 lpNumberOfBytesRead DWORD 型の変数へのポインタを指定します。 この変数に、実際に読み取られたバイト数が格納されます。 lpOverlapped パラメータに NULL を指定した場合は、 lpNumberOfBytesRead パラメータに NULL を指定することはできません。 lpOverlapped パラメータに有効なポインタを指定した場合は、 lpNumberOfBytesRead パラメータに NULL を指定することができます。 ─────────────────────────────── void MCFile::FileWrite(LPSTR lpBuff) { DWORD dwWrite; WriteFile(hFile,lpBuff,lstrlen(lpBuff)+1,&dwWrite,NULL); } ─────────────────────────────── ファイルにデータを書き込みます. ─────────────────────────────── WriteFile ファイルにデータを書き込みます。ファイルポインタの現在位置が、 書き込みの開始位置になります。書き込みが終了すると、 ファイルポインタの位置は、書き込んだバイト数だけ進められます。 BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ); パラメータ hFile ファイルのハンドルを指定します。このハンドルは、GENERIC_WRITE アクセスを 持っていなければなりません。 lpBuffer 書き込むデータが入ったバッファへのポインタを指定します。 nNumberOfBytesToWrite 書き込むバイト数を指定します。 lpNumberOfBytesWritten DWORD 型の変数へのポインタを指定します。 この変数に、実際に書き込まれたバイト数が格納されます。 lpOverlapped パラメータに NULL を指定した場合は、 lpNumberOfBytesWritten パラメータに NULL を指定することはできません。 lpOverlapped パラメータに有効なポインタを指定した場合は、 lpNumberOfBytesWritten パラメータに NULL を指定することができます。 さらに詳しくは、MSDNをご参照ください. ─────────────────────────────── void MCFile::FileClose() { if(hFile) CloseHandle(hFile); } ─────────────────────────────── ファイルハンドルが存在する場合、ファイルハンドルを解放しています. ─────────────────────────────── CloseHandle オープンしているオブジェクトハンドルをクローズします。 BOOL CloseHandle( HANDLE hObject ); パラメータ hObject オブジェクトのハンドルを指定します。 ─────────────────────────────── void MCFile::FileCopy(LPTSTR lpExitFileName,LPTSTR lpNewFileName) { CopyFile(lpExitFileName,lpNewFileName,TRUE); } ─────────────────────────────── CopyFile ファイルをコピーします。 BOOL CopyFile( LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists ); パラメータ lpExistingFileName 既存ファイルのファイル名が入った NULL で終わる文字列へのポインタを指定します。 lpNewFileName 新しいファイルのファイル名が入った NULL で終わる文字列へのポインタを指定します。 bFailIfExists lpNewFileName パラメータで指定したファイルがすでに存在していたときの動作を指定します。 TRUE を指定すると、関数は失敗します (コピーは行われません)。 FALSE を指定すると、既存のファイルを上書きし、関数は成功します。 ─────────────────────────────── void MCFile::FileDelete (LPTSTR szFileName) { if (hFile) { CloseHandle(hFile); DeleteFile(szFileName); } } ─────────────────────────────── DeleteFile 既存のファイルを削除します。 BOOL DeleteFile( LPCTSTR lpFileName ); パラメータ lpFileName 削除するファイルのファイル名が入った NULL で終わる文字列を指定します。 ─────────────────────────────── void MCFile::MakeDir(LPTSTR DirName) { CreateDirectory(DirName,NULL); } ─────────────────────────────── CreateDirectory ディレクトリを作成します。ファイルシステムがファイルとディレクトリの セキュリティをサポートしている場合は、指定されたセキュリティ記述子を 新しいディレクトリに適用します。 BOOL CreateDirectory( LPCTSTR lpPathName, // pointer to a directory path string LPSECURITY_ATTRIBUTES lpSecurityAttributes ); パラメータ lpPathName 作成するディレクトリのパス名が入った NULL で終わる文字列へのポインタを指定します。 パス名の最大長は、MAX_PATH 文字です。 lpSecurityAttributes セキュリティ属性が入ったSECURITY_ATTRIBUTES 構造体へのポインタを指定します ─────────────────────────────── void MCFile::MakeDirEx(LPTSTR TmpDir,LPTSTR NewDir) { CreateDirectoryEx(TmpDir,NewDir,NULL); } ─────────────────────────────── CreateDirectoryEx 新しいディレクトリを作成します。 ファイルシステムがファイルとディレクトリのセキュリティを サポートしている場合は、指定されたセキュリティ記述子が 新しいディレクトリに適用されます。 BOOL CreateDirectoryEx( LPCTSTR lpTemplateDirectory, LPCTSTR lpNewDirectory, LPSECURITY_ATTRIBUTES lpSecurityAttributes ); パラメータ lpTemplateDirectory テンプレートディレクトリのパス名が入った NULL で終わる文字列 へのポインタを指定します。 このディレクトリが、新しいディレクトリに対するテンプレートとして利用されます。 lpNewDirectory 作成するディレクトリのパス名が入った NULL で終わる文字列へのポインタを指定します。 lpSecurityAttributes セキュリティ属性が入ったSECURITY_ATTRIBUTES 構造体へのポインタを指定します。 ─────────────────────────────── void MCFile::DeleteDir(LPTSTR lpPathName) { RemoveDirectory(lpPathName); } ─────────────────────────────── RemoveDirectory 空のディレクトリを削除します。 BOOL RemoveDirectory( LPCTSTR lpPathName // pointer to directory to remove ); パラメータ lpPathName 削除するディレクトリのパス名が入った NULL で終わる文字列を指定します。 ディレクトリは、空でなければなりません。 また、呼び出し側プロセスは、ディレクトリを削除する権限をもっていなければなりません。 ─────────────────────────────── void MCFile::FileMove (LPTSTR lpExitFileName,LPTSTR lpNewFileName) { MoveFile(lpExitFileName,lpNewFileName); } ─────────────────────────────── MoveFile 既存のファイルまたはディレクトリを移動 (名前を変更) します。 BOOL MoveFile( LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName ); パラメータ lpExistingFileName 既存のファイル名またはディレクトリ名が入った NULL で終わる文字列へのポインタを指定します。 lpNewFileName ファイルまたはディレクトリの新しい名前が入った NULL で終わる文字列へのポインタを指定します。 ファイル名には、別のファイルシステムや別のドライブを指定しても構いません。 ディレクトリ名には別のドライブは指定できません。 ファイル名もディレクトリ名も、既存の名前を指定してはいけません。 ─────────────────────────────── void MCFile::FileGetFullPath(LPSTR lpFileName,CHAR* lpFullFileName) { LPTSTR lpFilePart; GetFullPathName(lpFileName,MAX_PATH,lpFullFileName,&lpFilePart); } ─────────────────────────────── GetFullPathName カレントドライブ名およびカレントディレクトリ名と、指定されたファイル名を連結します。 DWORD GetFullPathName( LPCTSTR lpFileName, // pointer to name of file to find path for DWORD nBufferLength, // size, in characters, of path buffer LPTSTR lpBuffer, // pointer to path buffer LPTSTR *lpFilePart // pointer to filename in path ); パラメータ lpFileName ファイル名が入った NULL で終わる文字列へのポインタを指定します。 nBufferLength lpBuffer バッファのサイズを指定します。 lpBuffer バッファへのポインタを指定します。このバッファに、カレントドライブ名および カレントディレクトリ名と、lpFileName パラメータで指定したファイル名とを 連結した名前が格納されます。 lpFilePart LPTSTR 型の変数へのポインタを指定します。この変数に、lpBuffer バッファ内のファイル名の 部分へのポインタが格納されます。 ─────────────────────────────── void MCFile::FileGetTmpFileName() { GetTempPath(MAX_PATH,szTmpPath); GetTempFileName(szTmpPath,"TMP",0,szTmpFile); hFile=CreateFile(szTmpFile,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_TEMPORARY,NULL); if (hFile==INVALID_HANDLE_VALUE) return; } ─────────────────────────────── ここでは、添付ファイル名および添付ファイルのディレクトリの取得を 行っています. ─────────────────────────────── GetTempPath テンポラリファイル用のディレクトリのパスを取得します。 DWORD GetTempPath( DWORD nBufferLength, LPTSTR lpBuffer ); パラメータ nBufferLength lpBuffer バッファのサイズを指定します。 lpBuffer バッファへのポインタを指定します。このバッファに、テンポラリファイル用の ディレクトリのパスが格納されます ─────────────────────────────── GetTempFileName テンポラリファイルのファイル名を作成します。 または、テンポラリファイルのファイル名を作成し、実際にテンポラリファイルを作成します。 UINT GetTempFileName( LPCTSTR lpPathName, // pointer to directory name for temporary LPCTSTR lpPrefixString, // pointer to filename prefix UINT uUnique, // number used to create temporary filename LPTSTR lpTempFileName ); パラメータ lpPathName テンポラリファイルを作成するパスのパス名が入った NULL で終わる ANSI 文字列への ポインタを指定します。 通常、カレントディレクトリを示すピリオドか、GetTempPath 関数の実行結果を指定します 。NULL を指定すると、この関数は失敗します。 lpPrefixString ファイル名のプリフィックスが入った NULL で終わる ANSI 文字列へのポインタを指定します。 このプリフィックスが、テンポラリファイルのファイル名の最初の文字として使われます。 ただし、プリフィックスは、最初の 3 文字までしか使われません。 uUnique 符号なし整数を指定します。この整数を基に、テンポラリファイルのファイル名が作成されます。 ─────────────────────────────── void MCFile::FileAttributes(LPSTR lpFileName) { HANDLE hFileTime; /* ファイルの日付を得るファイルハンドル */ FILETIME fLastWrite; /* ファイルの日付の最終書き込み時刻 */ SYSTEMTIME fSysLastWrite; FILETIME fLastAccess; /* ファイルの日付の最終アクセス時刻 */ SYSTEMTIME fSysLastAccess; FILETIME fCreate; /* ファイルの作成日時 */ SYSTEMTIME fSysCreate; DWORD dwFileSize; /* ファイルのサイズ */ /* 開かれているファイルが存在しないときにファイルを開く*/ if (!hFile) { hFileTime=CreateFile(lpFileName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL); if (hFileTime==INVALID_HANDLE_VALUE) return; }else { /* 開かれているファイルがある場合は、置き換えを行う。 */ hFileTime=hFile; } /* ファイルの日付を得る。*/ GetFileTime(hFileTime,&fCreate,&fLastAccess,&fLastWrite); /* システム時刻への変換を行う。 */ FileTimeToSystemTime(&fLastWrite,&fSysLastWrite); FileTimeToSystemTime(&fLastAccess,&fSysLastAccess); FileTimeToSystemTime(&fCreate,&fSysCreate); /* ファイルの日付の最終書き込み時刻 */ CharToFileTime(fSysLastWrite,szLastWrite); /* ファイルの作成日時 */ CharToFileTime(fSysCreate,szCreateTime); /* ファイルの日付の最終アクセス時刻 */ CharToFileTime(fSysLastAccess,szLastAccessTime); /* ファイルのサイズを得る */ dwFileSize=GetFileSize(hFileTime,NULL); wsprintf(szFileSize,"%d",dwFileSize); /* ファイルハンドルを閉じる*/ CloseHandle(hFileTime); } ─────────────────────────────── 紙面の都合上この情報は、MSDNにて調べてください. ─────────────────────────────── void MCFile::CharToFileTime(SYSTEMTIME sysTime,CHAR* szFileTime) { wsprintf(szFileTime,"%2d/%2d/%d %d:%2d:%2d", sysTime.wYear ,sysTime.wMonth ,sysTime.wDay , sysTime.wHour ,sysTime.wMinute ,sysTime.wSecond ); } ┌─────────────────────────────┐ 今回、ファイル操作関連のAPIを紹介しましたが、 もう少し簡単に使うことのできるAPIもあります. そちらのほうは、ある程度初歩のWindows系が終了したら 順に紹介させていただきます. それでは、また今回から一般の方の紹介をフッターに乗せています. なお、以上のプログラムは、私の動作環境VC++6.0 Win32 Application で確認済みです. ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ メールアドレス:<mailto:rain2000@geocities.co.jp> ホームページ :<http://www.geocities.co.jp/SiliconValley-Bay/3125> 発行者:rain2000 編集 :rain2000 このメールマガジンは,以下の発行者さんを通して発行してます. ●まぐまぐ: アドレス : http://www.mag2.com/ ID : 0000024922 ●クリックインカム: アドレス :http://clickincome.net/ ID : m00002885 ●Pubzine アドレス :Pubzine (http://www.pubzine.com/) ID :004293 ●ここでメール アドレス : http://mail.cocode.ne.jp/ ID : 0400100071 ●メルマガ天国 アドレス : http://melten.com/ ID : 300 ●E-magazine アドレス :http://www.emaga.com/ ID :cwindows ●Macky アドレス : http://macky.nifty.ne.jp/ ID : 2329 ●カプライト アドレス : http://kapu.cplaza.ne.jp/ ID : 234 また、登録解除などの手続きに関しましては,上記の ホームにてお願いします. 私宛にメールをいただいても、解除はおよび登録は いたしません. ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■■■■■■■■■■■■■■■■■■■■■■■■@■■■■■■.■■■■ 電話など購入はこちらで・・・・・。 ┌─────────────────────────────┐ 電話加入権激安!ISDNライトなら9800円で電話が引ける!?(株)コムズ ↓詳しくはここをクリック! <http://www.comzz.co.jp/cgi-bin/cookie/set.cgi?t=top&id=2543> └─────────────────────────────┘ フレッツ接続をご希望ならば、こちら!!!!! <http://www.info-ntt.co.jp/cgi-bin/telepocket/telepocket.cgi?id=10014057> ■■■■■■■■■■■■■■■■■■■■■■■■@■■■■■■.■■■■ ■■■■■■■■■■■■■■■■■■■■■■■■@■■■■■■.■■■■ [title]ディジタル・カンパニーNETWORK [url]http://dc-network.co.jp/ [comment] 特許出願済・税理士監修の小規模事業所(法人・個人)・会計初心者向け超かんたんPC会計ソフト [name]高丸 千奈美 [email]sales@dc-network.co.jp [category]コンピューター ■■■■■■■■■■■■■■■■■■■■■■■■@■■■■■■.■■■■ [title]SeaCom-net TV GAME市場 [url]http://www.seacom.co.jp/ [comment] 今話題の「プレステ2」をはじめ、ゲームの事なら何でも揃う!メガストアー「シーコム!」情報量満載です! [name]山口慶二 [email]t-boy@seacom.co.jp [category]趣味・生活 ■■■■■■■■■■■■■■■■■■■■■■■■@■■■■■■.■■■■ [title]らぶりぃぷろだくつホームページ [url]http://www3.justnet.ne.jp/~watch/lovely/ [comment] XMLを利用したサイバースペース(仮想共有空間)を展開するアマチュアのゲーム制作サークル。RPGを中心にゲームを開発中。 [name]渡辺浩晃 [email]watch@ma3.justnet.ne.jp [category]趣味・生活 ■■■■■■■■■■■■■■■■■■■■■■■■@■■■■■■.■■■■ [title]SugiSugiWorld [url]http://sugisugi.hoops.ne.jp/ [comment] LINUX初心者やWINDOWSからの移行者の為のサイト。アプリのインストールや設定を初心者向けに解説。 [name]杉岡 研史 [email]kenji_sugioka@agrex.co.jp [category]コンピューター ■■■■■■■■■■■■■■■■■■■■■■■■@■■■■■■.■■■■ [title]SCAL Software Production [url]http://scal.hypermart.net/ [comment] ソフトウェア制作サークル。フリーゲームソフト「Shopping2」好評DL中。現在プログラマー募集中です。まずはサイトにおいでください。 [name]後藤達也 [email]taji@po3.across.or.jp [category]コンピューター ■■■■■■■■■■■■■■■■■■■■■■■■@■■■■■■.■■■■ [title]Thirst [url]http://www.thirst.co.jp/ [comment] カスタムパソコン販売。低価格、高スペック、安心サポートならどこにも負けません。激安DOS/Vパーツ販売。在庫豊富で即日出荷! [name]篠宮 眞次 [email]shinji@acting.co.jp [category]オンラインショッピング ■■■■■■■■■■■■■■■■■■■■■■■■@■■■■■■.■■■■ [title]PCレスキュー協会 [url]http://www.go-rescue.com/ [comment] PCレスキュー協会。PCメンテナンスの全国規模の出張サービス業務。HPで依頼、価格廉価。 [name]桑原 恒雄 [email]t_kuwa@vir.bekkoame.ne.jp [category]コンピューター ■■■■■■■■■■■■■■■■■■■■■■■■@■■■■■■.■■■■ [title]SeaCom-net TV GAME市場 [url]http://www.seacom.co.jp/ [comment] 今話題の「プレステ2」をはじめ、ゲームの事なら何でも揃う!メガストアー「シーコム!」情報量満載です! [name]山口慶二 [email]t-boy@seacom.co.jp [category]オンラインショッピング ■■■■■■■■■■■■■■■■■■■■■■■■@■■■■■■.■■■■ [title]モバイル端末・PC周辺機器激安 [url]http://www.nwsquare.co.jp/ [comment] 携帯電話・モバイル通信機器・PC関連機器激安の穴場!携帯電話無料サービスも常設![name]高橋時哉 [email]todo@po.nwsquare.co.jp [category]オンラインショッピング ■■■■■■■■■■■■■■■■■■■■■■■■@■■■■■■.■■■■ [title]PC119(ピーシーレスキュー) [url]http://www.pc119online.com/ [comment] パソコンのトラブルなどの助け合いページです。すべて無料サービス。ポイントをためてチャンピオンをめざそう! [name]田井中一弥 [email]info@pc119online.com [category]コンピューター ■■■■■■■■■■■■■■■■■■■■■■■■@■■■■■■.■■■■ |