掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
MemoryStreamの異サイズ分割 (ID:36389)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
ぽむぽむさん、だから...さんの仰っているのは ファイルの中身を書き出す前に、そのサイズを保存しておけばOKということです。 procedure PackStream(fi: TStream; fo: TStream); var iSize: INT64; begin iSize := fi.Size; fo.WriteBuffer(iSize, SizeOf(iSize)); //←ここでサイズを保存しておく fo.CopyFrom(fi, 0); //←CopyFrom(fi, iSize)でも一緒 end; procedure RestoreStream(fi: TStream; fo: TStream); var iSize: INT64; begin fi.ReadBuffer(iSize, SizeOf(iSize)); //←ここでサイズが分かる fo.CopyFrom(fi, iSize); //←サイズ分Streamから読み込む end; こういうのを作っておいて、結合するときはPackStreamをファイル数だけ読み、 展開するときはRestoreStreamをその数だけ呼べばファイルサイズが分かるということです。 ファイル数が固定ならこれで十分かもしれませんが、不定なら 出力する前にファイル数も入れておくと良いかもしれませんね。 intFileCount = ?←どこかでファイル数が分かる fo.WriteBuffer(intFileCount, SizeOf(FileCount)); こうしてから、PackStreamをループして呼び出す。 展開するときは fi := TFileStream.Create(マージしたファイルのパス, fmOpenRead) fi.ReadBuffer(intFileCount, SizeOf(FileCount)); //←内包しているファイルの数が分かる for i:=0 to intFileCount-1 do begin strPath := パスの生成 fo := TFileStream.Create(strPath, fmCreate); PackStream(fi, fo); fo.Free; end; fi.Free; いかがでしょうか。 (動作未確認です)
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.