ab.com コミュニティ https://www.activebasic.com/forum/ |
|
ファイルの追加書き込み(SetFilePointerの動作) https://www.activebasic.com/forum/viewtopic.php?t=2652 |
ページ 1 / 1 |
作成者: | James [ 2010年8月16日(月) 17:27 ] |
記事の件名: | ファイルの追加書き込み(SetFilePointerの動作) |
ファイルの追加書き込みを行うソフトを作ろうと思い以下のコードを作成しました。 環境 XPSP3、AB4.24.0 コード: dim hFile As HANDLE dim lpOverlapped=NULL As OVERLAPPED dim buf[30] as Byte dim fname[30] as Byte dim gfs1 as DWORD '書き込みサイズ(予定) dim gfs2 as DWORD '書き込みサイズ(結果) dim i as integer 'ファイルポインタの結果 dim wans as integer '書き込み結果 if lstrcpy(buf,"abcdefghijklmnopqrstuvwxyz") = NULL then MsgBox NULL, buf, "文字列コピーミス", MB_ICONEXCLAMATION End If gfs1=lstrlen(buf) lstrcpy(fname,"read_log.txt") hFile=CreateFile(fname, GENERIC_WRITE or GENERIC_WRITE, FILE_SHARE_READ ,ByVal 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0) if hFile <> INVALID_HANDLE_VALUE then i=SetFilePointer(hFile, 0, NULL, FILE_END) 'ファイルポインタをファイルの最後に移動 if i <> -1 then '移動できたら wans=WriteFile(hFile,buf,gfs1,VarPtr(gfs2),lpOverlapped) if wans=TRUE then if(CloseHandle(hFile) = TRUE) then MsgBox NULL, "無事終了", "Error", MB_ICONEXCLAMATION Else MsgBox NULL, "ファイルのクローズミス", "Error", MB_ICONEXCLAMATION End If Else MsgBox NULL, "ファイルのオープンミス", "Error", MB_ICONEXCLAMATION End If Else MsgBox NULL, "ファイルポインタの移動エラー", "Error", MB_ICONEXCLAMATION End If Else MsgBox NULL, "ファイルが開けません", "Error", MB_ICONEXCLAMATION End Ifファイルをオープンし、ポインタを最後に動かし、書き込んでいるだけなのですが、 思ったように追加書き込みされず、常に新規書き込み(ファイルサイズは増えない) 状況です。 問題点は、SetFilePointerでポインタは移動するのですが、 その後WriteFileで書き込んでも、ポインタが移動しない(ポインタ0から書き込み) 事のようです。 根本的に、SetFilePointerの使い方(理解)が間違っているのでしょうか? それとも、CreateFileの宣言の仕方でしょうか? ご教授いただければ幸いです。 |
作成者: | James [ 2010年8月17日(火) 12:09 ] |
記事の件名: | 動作さえすれば |
色々とサンプルを作っているのですが、どうやってもファイルポインタが移動しません。 正確には、移動しても、その場所から書き込み/読み込みができません。 とりあえず、動作さえすればいいので、以下のコードを書いてみました。 コード: dim hFile As HANDLE dim lpOverlapped=NULL As OVERLAPPED dim buf[30] as Byte dim fname[30] as Byte dim gfs1 as DWORD '書き込みサイズ(予定) dim gfs2 as DWORD '書き込みサイズ(結果) dim i as integer 'ファイルポインタの結果 dim wans as integer '書き込み結果 dim buf1[200] as Byte dim buf2[200] as Byte if lstrcpy(buf,"abcdefghijklmnopqrstuvwxyz") = NULL then MsgBox NULL, buf, "文字列コピーミス", MB_ICONEXCLAMATION End If gfs1=lstrlen(buf) lstrcpy(fname,"read_log.txt") lstrcpy(buf1,"cmd") lstrcpy(buf2, "/c echo ") lstrcat(buf2,buf) lstrcat(buf2,">> ") lstrcat(buf2,fname) hFile=CreateFile(fname, GENERIC_WRITE or GENERIC_WRITE, FILE_SHARE_READ ,ByVal 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0) if hFile <> INVALID_HANDLE_VALUE then ShellExecute(NULL, NULL, buf1,buf2, NULL, SW_SHOWMINNOACTIVE) if(CloseHandle(hFile) = TRUE) then MsgBox NULL, "無事終了", "Error", MB_ICONEXCLAMATION Else MsgBox NULL, "ファイルのクローズミス", "Error", MB_ICONEXCLAMATION End If Else MsgBox NULL, "ファイルが開けません", "Error", MB_ICONEXCLAMATION End If同じようなことで困っている方のために、とりあえずの救済策です。 でも、何でSetFilePointerは動かない、いや動くけど その後の読み書きがうまくいかないんだろう。 根本的な解決策ご存じの方いませんか? |
作成者: | HSABP [ 2010年8月17日(火) 14:25 ] |
記事の件名: | 何もわかってない |
あなたは何もわかってない コード: Dim hFile As HANDLE Dim buf[30] as Byte Dim fname[30] as Byte Dim gfs1 as DWord '書き込みサイズ(予定) Dim gfs2 as DWord '書き込みサイズ(結果) Dim i as DWord 'ファイルポインタの結果 <--- DWord型 Dim wans as DWord '書き込み結果 <--- DWord型 Dim over As OVERLAPPED if lstrcpy(buf,"abcdefghijklmnopqrstuvwxyz") = NULL then MsgBox NULL, buf, "文字列コピーミス", MB_ICONEXCLAMATION End If gfs1=lstrlen(buf) lstrcpy(fname,"read_log.txt") ' <--- GENERIC_WRITE or GENERIC_WRITEでは意味が無いので修正。 hFile=CreateFile( fname, GENERIC_WRITE, 0 ,ByVal 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0) if hFile <> INVALID_HANDLE_VALUE then i=SetFilePointer( hFile, 0, NULL, FILE_END) 'ファイルポインタをファイルの最後に移動 if i <> -1 then '移動できたら ' <--- OVERLAPPED構造体を使うときは”必ず”オフセットを入れる /* over.Offset = i wans=WriteFile(hFile,buf,gfs1,VarPtr(gfs2), over) */ wans=WriteFile(hFile,buf,gfs1,VarPtr(gfs2), ByVal 0) ' <---同期書込みの場合は必要なし if wans=TRUE then if(CloseHandle(hFile) = TRUE) then MsgBox NULL, "無事終了", "Error", MB_ICONEXCLAMATION Else MsgBox NULL, "ファイルのクローズミス", "Error", MB_ICONEXCLAMATION End If Else MsgBox NULL, "ファイルのオープンミス", "Error", MB_ICONEXCLAMATION End If Else MsgBox NULL, "ファイルポインタの移動エラー", "Error", MB_ICONEXCLAMATION End If Else MsgBox NULL, "ファイルが開けません", "Error", MB_ICONEXCLAMATION End If[/url] |
作成者: | James [ 2010年8月17日(火) 17:40 ] |
記事の件名: | 無事に動きました |
何も分かっていないため、このコードは大変役に立ちました。 ありがとうございます。 WriteFileの第5パラメータを dim lpOverlapped=NULL As OVERLAPPED と宣言しておいて使うことができない事が、理解できないので、引数とアドレスに関して 重点的に勉強していきたいと思います。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |