■バイナリファイル

「■バイナリファイル」の編集履歴(バックアップ)一覧に戻る

■バイナリファイル - (2008/12/29 (月) 21:01:59) のソース

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

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

参考
ファイルの分割ツールを作ってみよう!(第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進数に直す。
 バイナリエディタ風。

*本体
 #-----------------------------------------------------------------------
 #-----------------------------------------------------------------------
 #-----------------------------------------------------------------------
 母艦の閉じた時は~
   バイナリ終了時実行処理。
 
 #-----------------------------------------------------------------------
 #-----------------------------------------------------------------------
 
 ■バイナリファイル
  ・現在位置
  ・次位置
  ・バッファサイズ{=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をストリーム同位置読む。
 それをバイナリダンプして言う。

----
#comment()

----
ツールボックス

下から選んでください:

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