*情報 作者名:五十六 引用元:なし *概要 ファイルストリームをもっと気軽に扱えるように。 具体的にはストリーム開く、閉じるの自動化。あとモードの自動変更、ファイルストリーム削除を無理やり実装など。 母艦の閉じた時は~を使ってるから複数あると誤作動するかも・・・ 参考 ファイルの分割ツールを作ってみよう!(第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() ----