ab.com コミュニティ https://www.activebasic.com/forum/ |
|
ファイルをひとつにまとめたりする方法 https://www.activebasic.com/forum/viewtopic.php?t=2610 |
ページ 1 / 1 |
作成者: | 水波形 [ 2010年1月02日(土) 23:52 ] |
記事の件名: | ファイルをひとつにまとめたりする方法 |
あけましておめでとうございます。 ご無沙汰しております。 今回、以前に『独自のインストーラ的なものを作りたい!』と、 リソースについて調べていましたが、Konisi様の助言で、 exeにファイルをくっつけていくという手段にしました。 しかし、やってみると、ひとつしかファイルをくっつけることが出来ません。 ということは、ZIPなどで圧縮して1つにまとめたものをくっつけるなどの方法しかないのですが、 それだと、『最初からZIPで配布しろや』ということになってしまいます。 (切り離しのコードをいじる実力はない) なので、適当なファイルにファイルを合成し、それをくっつけるという手段を選び、 いろいろと実験して来ました。 やっとの思いで、合成する側のコードは書けたと思うのですが、 それを元に戻すのがなぜか出来ません。 分かる方がいらっしゃいましたら、添削の方をお願いします。 まとめる処理 [ここをクリックすると内容が表示されます]
コード: リストボックスを作成し、そこにファイルの一覧(名前)を表示して、 そこからファイルまでのパスを作っています。 Dim num As Long Dim buf[1000] As BytePtr Dim hFile As HANDLE Dim n As Long Dim LastFileSize As Long num=SendDlgItemMessage(hMainWnd,ListBox1,LB_GETCOUNT,0,0) SetDlgItemText(hMainWnd,Static6,Str$(num)) 'ファイルを作る Open dir+"\game.test" For Output As #1 Print #1,"" Close #1 SetDlgItemText(hMainWnd,Static2,"ファイルを読み込んでいます....") For n=0 to num-1 Step 1 SetDlgItemText(hMainWnd,Static4,Str$(n)) 'nコ目のファイルタイトルを取得 Dim Length As Long Dim name As BytePtr Dim s As String Length=SendDlgItemMessage(hMainWnd,ListBox1,LB_GETTEXTLEN,n,0)+1 name=malloc(Length) SendDlgItemMessage(hMainWnd,ListBox1,LB_GETTEXT,n,name) s=MakeStr(name) free(name) '取得したタイトルから、ファイルパスを作る Dim path As String path=str+"\"+s '作ったパスから、読み込み用ファイルハンドルを作る Dim dwAccessByte As Long hFile=CreateFile(path,GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,ByVal 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0) If hFile=INVALID_HANDLE_VALUE Then MessageBox(hMainWnd,Ex"読み込みファイルハンドル作成時にエラーが発生しました!\r\n"+path,"Error File Number Is "+Str$(n)+" .",MB_OK or MB_ICONWARNING) Exit Sub End If 'ファイルサイズの取得 Dim FileSize As Long FileSize=GetFileSize(hFile,0) LastFileSize=LastFileSize+FileSize '読み込み領域の確保 buf[n]=malloc(FileSize+1) 'ファイルの読み込み If ReadFile(hFile,buf[n],FileSize,VarPtr(dwAccessByte),ByVal 0)=0 Then MessageBox(hMainWnd,"ファイル読み込み時にエラーが発生しました!!","Error "+Str$(n),MB_OK or MB_ICONWARNING) MessageBox(hMainWnd,Ex"FileSize="+Str$(FileSize)+Ex"\r\ndwAccessByte="+Str$(dwAccessByte),"",MB_OK or MB_ICONWARNING) End If 'ファイル名とサイズを記録 Open dir+"\FileInfo.txt" For Append As #1 Print #1,s+"="+Str$(FileSize) Close #1 'ハンドルを閉じて、繰り返す CloseHandle(hFile) Next 'ファイル名とサイズを記録したテキストファイルを読み出す hFile=CreateFile(dir+"\FileInfo.txt",GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,ByVal 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0) If hFile=INVALID_HANDLE_VALUE Then MessageBox(hMainWnd,Ex"読み込みファイルハンドル作成時にエラーが発生しました!\r\n"+path,"Error File Number Is TEXTFILE.",MB_OK or MB_ICONWARNING) Exit Sub End If 'ファイルサイズの取得 Dim TextSize As Long TextSize=GetFileSize(hFile,0) '読み込み領域の確保 Dim text As BytePtr text=malloc(FileSize+1) 'ファイルの読み込み If ReadFile(hFile,text,TextSize,VarPtr(dwAccessByte),ByVal 0)=0 Then MessageBox(hMainWnd,"ファイル読み込み時にエラーが発生しました!!","Error "+Str$(n),MB_OK or MB_ICONWARNING) MessageBox(hMainWnd,Ex"FileSize="+Str$(FileSize)+Ex"\r\ndwAccessByte="+Str$(dwAccessByte),"",MB_OK or MB_ICONWARNING) End If '読み込んだデータをまとめる Dim AllData As BytePtr AllData=malloc(LastFileSize+TextSize+1025) SetDlgItemText(hMainWnd,Static2,"ファイルデータを結合しています") 'テキストファイルを結合 If lstrcat(AllData,text)=NULL Then MessageBox(hMainWnd,"テキストファイルの追加に失敗しました!!","Error",MB_OK or MB_ICONWARNING) End If 'テキストファイルの重さを結合 Dim ss As String ss=Str$(TextSize) If lstrcat(AllData,StrPtr(ss))=NULL Then MessageBox(hMainWnd,"テキストファイルの追加に失敗しました!!","Error",MB_OK or MB_ICONWARNING) End If For n=0 to num-1 Step 1 SetDlgItemText(hMainWnd,Static4,Str$(n)) If lstrcat(AllData,buf[n])=NULL Then MessageBox(hMainWnd,"データ連結時にエラーが発生しました。","Error File Num "+Str$(n),MB_OK or MB_ICONWARNING) End If Next CloseHandle(hFile) 'まとめたデータを書き出す用のハンドル作成 hFile=CreateFile(dir+"\game.test",GENERIC_WRITE,0,ByVal 0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0) If hFile=INVALID_HANDLE_VALUE Then MessageBox(hMainWnd,Ex"ファイルハンドル作成時にエラーが発生しました!","Error まとめファイルハンドル作成時",MB_OK or MB_ICONWARNING) Exit Sub End If SetDlgItemText(hMainWnd,Static6,"ファイルを書き出しています...") 'まとめたデータを書き出す If WriteFile(hFile,AllData,LastFileSize,VarPtr(dwAccessByte),ByVal 0)=FALSE Then MessageBox(hMainWnd,"ファイル作成時にエラーが発生しました!!","Last Error",MB_OK or MB_ICONWARNING) MessageBox(hMainWnd,Str$(LastFileSize)+","+Str$(dwAccessByte),0,0) End If CloseHandle(hFile) MessageBox(hMainWnd,"処理終了","End",MB_OK or MB_ICONINFORMATION) SetDlgItemText(hMainWnd,Static2,"処理完了") とりあえず、FileInfo.txtだけを読み出そうとして失敗したコード [ここをクリックすると内容が表示されます]
コード: #N88BASIC Dim hFileRead As HANDLE Dim hFileWrite As HANDLE Dim FileSize As Long Dim buf As BytePtr Dim dwAccessByte As Long 'テキストファイルの重さを抽出 hFileRead=CreateFile("game.test",GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,ByVal 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0) If hFileRead=INVALID_HANDLE_VALUE Then MessageBox(0,Ex"読み込みファイルハンドル作成時にエラーが発生しました!","Error",MB_OK or MB_ICONWARNING) End If buf=malloc(1025) If ReadFile(hFileRead,buf,FileSize,VarPtr(dwAccessByte),ByVal 0)=0 Then MessageBox(0,"ファイル読み込み時にエラーが発生しました!!","Error ",MB_OK or MB_ICONWARNING) End If 'テキストファイルを出力 Dim TextFileSize As Long TextFileSize=Val(Str$(buf))/1024 free(buf) buf=malloc(TextFileSize+1) SetFilePointer(hFileRead,1024,NULL,FILE_BEGIN) If ReadFile(hFileRead,buf,TextFileSize,VarPtr(dwAccessByte),ByVal 0)=0 Then MessageBox(0,"ファイル読み込み時にエラーが発生しました!!","Error ",MB_OK or MB_ICONWARNING) End If hFileWrite=CreateFile("FileInfo.txt",GENERIC_WRITE,0,ByVal 0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0) If hFileWrite=INVALID_HANDLE_VALUE Then MessageBox(0,Ex"書き込みファイルハンドル作成時にエラーが発生しました!","Error",MB_OK or MB_ICONWARNING) End If If WriteFile(hFileWrite,buf,TextFileSize,VarPtr(dwAccessByte),ByVal 0)=FALSE Then MessageBox(0,"テキストファイル作成時にエラーが発生しました!!","Error",MB_OK or MB_ICONWARNING) End If free(buf) CloseHandle(hFileWrite) CloseHandle(hFileRead) |
作成者: | konisi [ 2010年1月03日(日) 16:48 ] |
記事の件名: | |
まだ実行してみてないのですが、読み込むほうだけ見てて怪しいなと思ったところが2点。 コード: 'テキストファイルを出力 Dim TextFileSize As Long TextFileSize=Val(Str$(buf))/1024 free(buf)の部分、bufはBytePtr型なので、こいつをStr$に渡してもbuf自体が格納しているアドレスをString型にして返すだけです。 MakeStr関数を使ってみてください。 もう1つは、その直前のReadFile関数の第3引数が初期化されていない点。グローバル変数なので今の実装では0で初期化されてる筈。 つまり1バイトも読み込めていません。 |
作成者: | 水波形 [ 2010年1月13日(水) 22:16 ] |
記事の件名: | ご回答ありがとうございます |
ためしに修正したみたところ、 1Byteも読み込まれなくなってしまったのですが・・・ [ここをクリックすると内容が表示されます]
コード: Dim hFileRead As HANDLE Dim hFileWrite As HANDLE Dim FileSize As Long Dim buf As BytePtr Dim dwAccessByte As Long 'テキストファイルの重さを抽出 hFileRead=CreateFile("game.test",GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,ByVal 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0) If hFileRead=INVALID_HANDLE_VALUE Then Print "読み込みファイルハンドル作成時にエラーが発生しました!" Sleep(-1) End If buf=malloc(1025) FileSize=GetFileSize(hFileRead,0) If FileSize=&HFFFFFFFF Then Print "FileSize Error" Sleep(-1) End If If ReadFile(hFileRead,buf,1024,VarPtr(dwAccessByte),ByVal 0)=0 Then Print "ファイル読み込み時にエラーが発生しました!!" Sleep(-1) End If 'テキストファイルを出力 Dim TextFileSize As Long TextFileSize=Val(buf)/1024 free(buf) buf=malloc(TextFileSize+1) SetFilePointer(hFileRead,1024,NULL,FILE_BEGIN) If ReadFile(hFileRead,buf,TextFileSize,VarPtr(dwAccessByte),ByVal 0)=0 Then MessageBox(0,"ファイル読み込み時にエラーが発生しました!!","Error ",MB_OK or MB_ICONWARNING) End If hFileWrite=CreateFile("FileInfo.txt",GENERIC_WRITE,0,ByVal 0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0) If hFileWrite=INVALID_HANDLE_VALUE Then MessageBox(0,Ex"書き込みファイルハンドル作成時にエラーが発生しました!","Error",MB_OK or MB_ICONWARNING) End If If WriteFile(hFileWrite,buf,TextFileSize,VarPtr(dwAccessByte),ByVal 0)=FALSE Then MessageBox(0,"テキストファイル作成時にエラーが発生しました!!","Error",MB_OK or MB_ICONWARNING) End If free(buf) CloseHandle(hFileWrite) CloseHandle(hFileRead) |
作成者: | カロン [ 2010年1月13日(水) 23:51 ] |
記事の件名: | 厳しい言い方ですが |
まず、ファイルフォーマットを明確にして下さい。 あなたのコードは非常に長いので、読みにくいです。 はっきり言って本人に分からないものなど、読む気もしないというのが本音です。 TextFileSize=Val(buf)/1024 ここのTextFileSizeを適当に変えることでその値だけファイルを読むことはできるので、 ここがおかしいであろうと思われます。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |