■バイナリファイル

情報

作者名:五十六
引用元:なし

概要

ファイルストリームをもっと気軽に扱えるように。
具体的にはストリーム開く、閉じるの自動化。あとモードの自動変更、ファイルストリーム削除を無理やり実装など。
母艦の閉じた時は~を使ってるから複数あると誤作動するかも・・・

参考
ファイルの分割ツールを作ってみよう!(第75回):クジラ飛行机「文系サラリーマンのための仕事に役立つプログラミング入門」
http://pc.nikkeibp.co.jp/article/column/20080522/1003240/?P=2

解説

[読書メンバ]
・ファイル
・現在位置
・次位置
・バッファサイズ
・ファイルサイズ

[命令メンバ]
※↓4つのA(開始バイト位置)は0起点
・ストリーム読む(AからCNTを)  
・ストリーム書く(AからBを|AにBを)
・ストリーム挿入書く(AからBを|AにBを)
・ストリーム削除(AからCNTを)

・ストリーム同位置読む(CNTを)
・ストリーム同位置書く(Aを)
・ストリーム同位置挿入書く(Aを)

・ストリーム続き読む(CNTを)
・ストリーム続き書く(Aを)
・ストリーム続き挿入書く(Aを)

・ストリーム右端読む(CNTを)
・ストリーム右端書く(Aを)
・ストリーム右端削除(CNTを)

・ストリーム初期化
・ストリームファイル削除
・ストリームファイル完全削除

↑説明省略 ノリで

●バイナリアドレス変換
  「00000040x0A」とか「0000004A」とかを10進数に直す。
 バイナリエディタ風。

本体

#-----------------------------------------------------------------------
#-----------------------------------------------------------------------
#-----------------------------------------------------------------------
母艦の閉じた時は~
  バイナリ終了時実行処理。

#-----------------------------------------------------------------------
#-----------------------------------------------------------------------

■バイナリファイル
 ・現在位置{=0}
 ・次位置{=0}
 ・バッファサイズ{=524288}/*512KB*/
 ・{非公開}元ファイル名
 ・{非公開}一時ファイル名
 ・{非公開}保持バイト数
 ・{非公開}経過バイト数
 ・{非公開}FILE
 ・ファイル存在
 ・モード
 ・ハンドル
 ・ファイルサイズ
 ・ファイル ←ファイル設定 →ファイル取得
 ・ファイル設定(Vに|Vを)~
   自身→FILE=V。
   自身→現在位置=0。//リセットされます
   自身→次位置=0。
   もし、Vの存在=はいならば
     自身→ファイル存在=はい。
     自身→モード=「読」。自身→ハンドル=Vを「読」でファイルストリーム開く。
     自身→ファイルサイズ=(自身→ハンドル)のファイルストリームサイズ。
     自身→モード=空。(自身→ハンドル)をファイルストリーム閉じる。自身→ハンドル=空。
   違えば
     自身→ハンドル=空。自身→ファイル存在=いいえ。
     自身→ファイルサイズ=空。自身→モード=空。
 ・ファイル取得(Vを)~それ=V。
 ・ストリーム初期化~
   もし、自身→FILE=空ならば、「ファイルが指定されていません」で戻る。
   自身→モード=「作」。自身→ハンドル=(自身→FILE)を「作」でファイルストリーム開く。
   自身→モード=空。(自身→ハンドル)をファイルストリーム閉じる。自身→ハンドル=空。
   自身→ファイルサイズ=0。自身→ファイル存在=はい。自身→現在位置=0。自身→次位置=0。
   
 ・ストリーム読む(AからCNTを)~
   もし、自身→FILE=空ならば、「ファイルが指定されていません」で戻る。
   もし、(自身→ファイル存在)=いいえならば、「ファイルがありません」で戻る。
   もし、(自身→モード=「書」)または(自身→モード=「作」)ならば
     自身→モード=空。(自身→ハンドル)をファイルストリーム閉じる。自身→ハンドル=空。
     
   もし、自身→ハンドル=空ならば
     自身→モード=「読」。自身→ハンドル=(自身→FILE)を「読」でファイルストリーム開く。
   
   自身→モード=「読」。
   自身→現在位置=A。自身→次位置=A+CNT。
   (自身→ハンドル)で(自身→現在位置)にファイルストリーム位置設定。
   (自身→ハンドル)でCNTをファイルストリーム読む。
   それで戻る。
 ・ストリーム書く(AからBを|AにBを)~
   もし、自身→FILE=空ならば、「ファイルが指定されていません」で戻る。
   もし、(自身→ファイル存在)=いいえならば、自身→ストリーム初期化。
   
   もし、(自身→モード=「読」)または(自身→モード=「作」)ならば
     自身→モード=空。(自身→ハンドル)をファイルストリーム閉じる。自身→ハンドル=空。
     
   もし、自身→ハンドル=空ならば
     自身→モード=「書」。自身→ハンドル=(自身→FILE)を「書」でファイルストリーム開く。
   
   自身→モード=「書」。
   自身→現在位置=A。自身→次位置=A+(Bのバイト数)。
   (自身→ハンドル)で(自身→現在位置)にファイルストリーム位置設定。
   (自身→ハンドル)でBをファイルストリーム書く。
   自身→ファイルサイズ=(自身→ハンドル)のファイルストリームサイズ。
   「1」で戻る。
   
 ・ストリーム削除(AからCNTを)~
   もし、自身→FILE=空ならば、「ファイルが指定されていません」で戻る。
   もし、(自身→ファイル存在)=いいえならば、「ファイルがありません」で戻る。
   
   もし、(自身→モード=「読」)または(自身→モード=「書」)ならば
     自身→モード=空。(自身→ハンドル)をファイルストリーム閉じる。自身→ハンドル=空。
     
   自身→元ファイル名=自身→FILE。
   自身→一時ファイル名=((自身→元ファイル名)からパス抽出)で((自身→元ファイル名)からファイル名抽出)のユニークファイル名生成。
   
   (自身→元ファイル名)から(自身→一時ファイル名)へファイル名変更。
   自身→保持バイト数=A。
   
   H1=(自身→一時ファイル名)を「読」でファイルストリーム開く。
   H2=(自身→元ファイル名)を「書」でファイルストリーム開く。
   
   H1で0にファイルストリーム位置設定。
   H2で0にファイルストリーム位置設定。
   
   CNT2 =INT((自身→保持バイト数)÷(自身→バッファサイズ))。
   もし、((自身→保持バイト数)%(自身→バッファサイズ))<>0ならば、CNT2=CNT2+1。
   
   Jを0からCNT2まで繰り返す
     SZ=(自身→バッファサイズ)。
     NEXT=(J+1)*(自身→バッファサイズ)
     もし、NEXT>(自身→保持バイト数)ならば、SZ=(自身→保持バイト数)-J*(自身→バッファサイズ)
     S=H1でSZをファイルストリーム読む。
     H2でSをファイルストリーム書く。
     
   自身→保持バイト数=(自身→ファイルサイズ)-CNT-A。
   H1で(A+CNT)にファイルストリーム位置設定。
   
   CNT2 =INT((自身→保持バイト数)÷(自身→バッファサイズ))。
   もし、((自身→保持バイト数)%(自身→バッファサイズ))<>0ならば、CNT2=CNT2+1。
   
   Jを0からCNT2まで繰り返す
     SZ=(自身→バッファサイズ)。
     NEXT=(J+1)*(自身→バッファサイズ)
     もし、NEXT>(自身→保持バイト数)ならば、SZ=(自身→保持バイト数)-J*(自身→バッファサイズ)
     S=H1でSZをファイルストリーム読む。
     H2でSをファイルストリーム書く。
     
   H1をファイルストリーム閉じる。
   H2をファイルストリーム閉じる。
   
   (自身→一時ファイル名)をファイル完全削除。
   
   自身→ファイル=自身→元ファイル名。
   自身→現在位置=A。
   自身→次位置=A。
  
 ・ストリーム挿入書く(AからBを|AにBを)~
   もし、自身→FILE=空ならば、「ファイルが指定されていません」で戻る。
   もし、(自身→ファイル存在)=いいえならば、自身→ストリーム初期化。
   もし、(自身→モード=「読」)または(自身→モード=「書」)ならば
     自身→モード=空。(自身→ハンドル)をファイルストリーム閉じる。自身→ハンドル=空。
     
   自身→元ファイル名=自身→FILE。
   自身→一時ファイル名=((自身→元ファイル名)からパス抽出)で((自身→元ファイル名)からファイル名抽出)のユニークファイル名生成。
   
   (自身→元ファイル名)から(自身→一時ファイル名)へファイル名変更。
   自身→保持バイト数=A。
   
   H1=(自身→一時ファイル名)を「読」でファイルストリーム開く。
   H2=(自身→元ファイル名)を「書」でファイルストリーム開く。
   
   H1で0にファイルストリーム位置設定。
   H2で0にファイルストリーム位置設定。
   
   CNT2 =INT((自身→保持バイト数)÷(自身→バッファサイズ))。
   もし、((自身→保持バイト数)%(自身→バッファサイズ))<>0ならば、CNT2=CNT2+1。
   
   Jを0からCNT2まで繰り返す
     SZ=(自身→バッファサイズ)。
     NEXT=(J+1)*(自身→バッファサイズ)
     もし、NEXT>(自身→保持バイト数)ならば、SZ=(自身→保持バイト数)-J*(自身→バッファサイズ)
     S=H1でSZをファイルストリーム読む。
     H2でSをファイルストリーム書く。
   
   //挿入
   H2でBをファイルストリーム書く。
   
   自身→保持バイト数=(自身→ファイルサイズ)-A。
   CNT2 =INT((自身→保持バイト数)÷(自身→バッファサイズ))。
   もし、((自身→保持バイト数)%(自身→バッファサイズ))<>0ならば、CNT2=CNT2+1。
  
   Jを0からCNT2まで繰り返す
     SZ=(自身→バッファサイズ)。
     NEXT=(J+1)*(自身→バッファサイズ)
     もし、NEXT>(自身→保持バイト数)ならば、SZ=(自身→保持バイト数)-J*(自身→バッファサイズ)
     S=H1でSZをファイルストリーム読む。
     H2でSをファイルストリーム書く。
   
   H1をファイルストリーム閉じる。
   H2をファイルストリーム閉じる。
   
   (自身→一時ファイル名)をファイル完全削除。
   
   自身→ファイル=自身→元ファイル名。
   自身→現在位置=A。
   自身→次位置=A+(Bのバイト数)。
   
 ・ストリーム同位置読む(CNTを)~
   自身→ストリーム読む((自身→現在位置)から(CNT)を)。
 ・ストリーム同位置書く(Aを)~
   自身→ストリーム書く((自身→現在位置)から(A)を)。
 ・ストリーム同位置挿入書く(Aを)~
   自身→ストリーム挿入書く((自身→現在位置)から(A)を)。
 ・ストリーム続き読む(CNTを)~
   自身→ストリーム読む((自身→次位置)から(CNT)を)。
 ・ストリーム続き書く(Aを)~
   自身→ストリーム書く((自身→次位置)から(A)を)。
 ・ストリーム続き挿入書く(Aを)~
   自身→ストリーム挿入書く((自身→次位置)から(A)を)。
 ・ストリーム右端読む(CNTを)~
   自身→ストリーム読む(((自身→ファイルサイズ)-CNT)からCNTを)。
 ・ストリーム右端書く(Aを)~
   自身→ストリーム書く((自身→ファイルサイズ)から(A)を)。
 ・ストリーム右端削除(CNTを)~
   自身→ストリーム削除(((自身→ファイルサイズ)-CNT)からCNTを)。
   
 ・ストリーム閉じる~
   もし、自身→ハンドル≠空ならば、(自身→ハンドル)をファイルストリーム閉じる。
   自身→FILE=空。自身→ファイルサイズ=空。自身→モード=空。自身→現在位置=0。自身→次位置=0。
   自身→ファイル存在=いいえ。自身→ハンドル=空。

 ・ストリームファイル削除~
   もし、自身→FILE=空ならば、「ファイルが指定されていません」で戻る。
   もし、(自身→ファイル存在)=いいえならば、「ファイルがありません」で戻る。
   もし、自身→ハンドル≠空ならば、(自身→ハンドル)をファイルストリーム閉じる。
   (自身→FILE)をファイル削除。
   
 ・ストリームファイル完全削除~
   もし、自身→FILE=空ならば、「ファイルが指定されていません」で戻る。
   もし、(自身→ファイル存在)=いいえならば、「ファイルがありません」で戻る。
   もし、自身→ハンドル≠空ならば、(自身→ハンドル)をファイルストリーム閉じる。
   (自身→FILE)をファイル完全削除。
   
 ・作る~
   バイナリ終了時実行処理内容に「{名前}のストリーム閉じる。」を配列追加。

バイナリ終了時実行処理内容=空。
●バイナリ終了時実行処理
  バイナリ終了時実行処理内容をナデシコする。
  
●バイナリアドレス変換(Sを|Sの)
  もし、Sの1から「x」を文字検索>0ならば
    S=Sを「x」で区切る。S[0]から1バイト右端削除。S[1]の1から1バイト削除。S=S[0]&S[1]。
  Sを16で十進数して戻る。
#-----------------------------------------------------------------------
!進数英語リスト=「ABCDEFGHIJKLMNOPQRSTUVWXYZ」を文字列分解。
!進数数値リスト=「10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35」を「,」で区切る。

●十進数(SをVで)
  合計値とは数値。S=Sを文字列分解して配列逆順。
  進数英語リストで反復、S=Sの対象を進数数値リスト[回数-1]に単置換。
  Sで反復、合計値=合計値+(対象×(V^(回数-1)))。
  合計値で戻る。
  
●進数(SをV|SのV|SでV)
  結果配列とは配列。
  1の間
    もし、S<Vならば
      進数数値リストで反復、S=Sの対象を進数英語リスト[回数-1]に単置換。    
      結果配列にSを配列追加。抜ける。
    C=S%V。進数数値リストで反復、C=Cの対象を進数英語リスト[回数-1]に単置換。
    結果配列にCを配列追加。S=(S/V)の整数部分。
  結果配列を配列逆順して空で配列結合して戻る。
  
●進数変換(SをAからBに)
  S=SをAで十進数。Sの(B)進数で戻る。
#-----------------------------------------------------------------------
#-----------------------------------------------------------------------
#-----------------------------------------------------------------------

//サンプルプログラム

テストとはバイナリファイル。
テストのファイル=ファイル選択。

テストのファイルサイズを言う。

テストの74から10/*バイト*/をストリーム読む。
それをバイナリダンプして言う。

テストの(「00000040x0A」をバイナリアドレス変換)から10をストリーム読む。
それをバイナリダンプして言う。

テストの(「0000004A」をバイナリアドレス変換)から10をストリーム読む。
それをバイナリダンプして言う。

テストの10をストリーム同位置読む。
それをバイナリダンプして言う。

●ストリームファイルコピー(BAFAでSからVへ|BAFAでSからVに)
  もし、S=空ならば、「0」で戻る。
  もし、V=空ならば、「0」で戻る。
  AAストリをバイナリファイルとして作成。AAストリ→ファイル=S。
  BBストリをバイナリファイルとして作成。BBストリ→ファイル=V。
  AAストリ→バッファサイズ=BAFA。
  BBストリ→ストリーム初期化。
  
  CNT2=INT((AAストリ→ファイルサイズ)÷(AAストリ→バッファサイズ))。
  もし、((AAストリ→ファイルサイズ)%(AAストリ→バッファサイズ))<>0ならば、CNT2=CNT2+1。
  
  Jを0からCNT2まで繰り返す
    SZ=(AAストリ→バッファサイズ)。
    NEXT=(J+1)*(AAストリ→バッファサイズ)。
    もし、NEXT>(AAストリ→ファイルサイズ)ならば、SZ=(AAストリ→ファイルサイズ)-J*(AAストリ→バッファサイズ)
    S=AAストリ→ストリーム続き読む(SZを)。
    BBストリ→ストリーム続き書く(Sを)。
  
  AAストリ→ストリーム閉じる。BBストリ→ストリーム閉じる。
  「1」で戻る。


  • グループのメンバ関数内でメンバ変数を扱う場合、「自身→」は不要です。 -- SWinX (2009-01-05 12:12:37)
  • な、なんだってー!Ω -- 管理人 (2009-01-07 00:18:15)
名前:
コメント:


タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2009年05月31日 17:26
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。