2010 04 01

ファイル分割

サポート部門とやりとりする中で、 「ログを採取してメールで送付してください」 と依頼されることがよくある。

送るのは別に構わないのだが、送るデータのサイズが無駄にでかいんだよね。 圧縮して7メガとか。 相手もそれは判っていて、環境(と言ってもエコとかではない方向)に配慮したメッセージも付記してくる。 「当方のメールボックスの容量制限のため、サイズが大きい場合は2メガ程度に分割して送付してください」 なんて。

こっちはこっちで、送信するのに最大3メガ程度の上限設定があるようで、あまり大きいものはエラーになってしまう。 だからと言って、CDなんかに焼いて郵送するのは、いちいち時間がかかるのでやりたくない。

で、分割したいのだが、そこで問題になるのが、俺が今いる環境。 客先で客先から借りているPCで作業しているのだが、これが word と excel ぐらいしか入ってない。 ファイル分割ツールをネットからダウンロードしてインストールすることは許可されない。 そもそもインターネットに繋ぐことが許可されない。

ということで、自分で分割ツールを作ってみた。 WSHで動くjscriptとして。 これだと必要なのはメモ帳だけだし、自分で作ったものだから、不正アプリのインストールだと文句を言われることも無いだろう。

// ファイル分割 var SOURCE = 'logs.zip'; // 分割対象ファイル名 var BYTES = 2000000; // 分割サイズ var sourceStream = null; var outputStream = null; var uniteBatFile = null; try { sourceStream = WScript.CreateObject( 'ADODB.Stream' ); sourceStream.type = 1; sourceStream.Open(); sourceStream.LoadFromFile( SOURCE ); sourceStream.position = 0; outputStream = WScript.CreateObject( 'ADODB.Stream' ); outputStream.type = 1; outputStream.Open(); outputStream.position = 0; uniteBatFile = WScript.CreateObject( 'Scripting.FileSystemObject' ).CreateTextFile( 'unite_' + SOURCE + '.bat' ); for ( var no = 0; !sourceStream.EOS; no++ ) { var outputFileName = SOURCE + '.' + no; outputStream.Write( sourceStream.Read( BYTES ) ); outputStream.SaveToFile( outputFileName ); outputStream.Close(); outputStream.Open(); uniteBatFile.Write( ( no ? '" + "' : 'copy /B "' ) + outputFileName ); } uniteBatFile.WriteLine( '" "' + SOURCE + '"' ); WScript.Echo( 'success : ' + no ); } catch ( e ) { WScript.Echo( 'error : ' + e.description ); } if ( sourceStream ) sourceStream.Close(); if ( outputStream ) outputStream.Close(); if ( uniteBatFile ) uniteBatFile.Close();

うかつにも知らなかったのだが、FileSystemObjectはバイナリデータを扱えないんだね。 バイナリデータにはADBDB.Streamを使う。 こんなオブジェクトがあることを初めて知ったよ。

そう使用頻度が高くないことが前提の急造品なので、いろいろ制約がある。 以下、主な制約と言い訳。

まずは、何をどう分割するかでプログラムを毎回書き換えなければいけないというスパルタンな仕様。 引数で指定することも考えたが、結局止めた。 連続して実行しないなら、引数で指定するのも中に直接書くのも、手間は大して変わらない。 で、多分、連続して実行するようなことは無い。 余計な手間をかけないで、速く作って早く使うべきだなのだ。

次に、コマンドライン文字列の長さ制限を全く意識していない、分割したファイルを結合するためのバッチファイル。 ファイルが大量にあると、きっと上手くいかない。 けどまあ、そんな大量に分割ファイルを作らないし、仮に作っても送れない。 俺が。 主に精神的な理由で。

ところで、windows環境なら必ず動作するファイル選択ダイアログって、ないのかな。 Microsoftのサイトに載っていたサンプルはXP限定だった。 htaにすればたぶん出来るんだろうけど、それはまた何か違うって気もするし。