• 締切済み

巨大ファイルの結合

Win98を対象としたファイル結合ソフトを作りました。 newでメモリ確保してaとbを結合しますが、結合後に2Gになるものなら空き領域が2Gぐらい必要なのでそのような場合には使えないソフトとなってしまいました。 空き領域がほとんど無くて、1.9Gのaに0.1Gのbを結合してaを上書きする感じで結合させたいのですが、アセンブラ以外の方法を教えてください。

  • elngr
  • お礼率25% (22/86)

みんなの回答

  • tea_sheep
  • ベストアンサー率53% (8/15)
回答No.5

> ANo.4 メモリマップトファイルの場合は後からサイズ拡張できないので あらかじめファイルサイズを2GBにしておかなければならないのと、 Win9X系ではファイル全体が共有メモリ領域(1GB)にマッピング できなければいけないという制約があったりして、この場合には 適用できないかと。NT/2k系だと部分的にマッピングしたりとか してできるとは思いますが。 やっぱりNo3の方の追加モードがベストな手段だと思います。

elngr
質問者

お礼

あらかじめファイルサイズを2GBにしておかなければならないということではメモリマップトファイルは今回は使えませんね。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★『メモリ・マップドファイル』という技術を利用するのは?どう。 ・これはファイルをメモリのように扱える方法でメモリコピーの関数で追加など出来ます。  今回のように巨大なファイルやディスク容量に限りがある場合には有効な手段だと私は思います。 ・『巨大ファイルの合併』方法としては、  (1)1.9GバイトのファイルAを『メモリ・マップドファイル』に割り付ける。→α  (2)0.1GバイトのファイルBを『メモリ・マップドファイル』に割り付ける。→β  (3)αデータのポインタ位置を最後に移動する。→α += 1.9Gのサイズ分;  (4)αデータのポインタ位置にβデータをメモリ・コピー関数で結合する。→MemoryCopy(α,β,0.1Gのサイズ);  (5)α、βの『マップドファイル』のメモリ割り付けを解除する。→普通のファイルに戻る。  (6)巨大ファイル 1.9Gバイト(α) に 0.1Gバイト(β)のデータが結合する。 ・これならばメモリ確保しなくても良いし、1.9Gバイトのファイルに上書きした感じで結合されます。 最後に: ・『メモリ・マップドファイル』は『CreateFileMapping』API関数で行えますが、MFCなら専用のクラスが  あります。MFC は使ったことがないため詳しくありませんが、ファイルをメモリに変換する方法が今回の  『メモリ・マップドファイル』の事です。 ・http://www.fsinet.or.jp/~madcap/memmap.html→『メモリマップドファイル』 ・http://homepage2.nifty.com/DSS/WinSys/Win/FileMapping.htm→『メモリマップドファイル』 ・http://www.h6.dion.ne.jp/~game296o/DXCLS_MemoryMappedFile.html→『メモリマップドファイルクラス』 ・すべて C/C++ で実装できます。アセンブラ以外です。ただ1点、『メモリ・マップドファイル』で 1.9 G  の巨大ファイルが扱えたかどうか良く覚えていません。上限は 1G バイトだったような気が…。 ・もしも、1G 以上が扱えなかった場合は、回答者 No.3 さんの方法が有効になります。  追加モードで 1.9G バイトのファイルを開き、0.1G バイトのファイルを読み込み専用でオープンして  単純に fread、fwrite して合併すれば良いでしょう。 ・以上です。参考に!

参考URL:
http://www11.ocn.ne.jp/~ikalu/win32api/0014.html
elngr
質問者

お礼

(1)~(6)の手順を見るとできそうですね。 試してみます。

回答No.3

普通は、アペンドモードで a をオープンしたりしますが。 Cなら、 fopen("filename", "a"); // テキストファイル fopen("filename", "ab"); // バイナリファイル C++なら、 ofstream("filename", ios::app); ※テキストファイルならOK,バイナリファイルでやったことはないので不明 これで、a をオープンして、ひたすら、write すればOKです。

elngr
質問者

補足

ありがとうございます。 僕がやりたいことができている結合ソフトがありました。 そのソフトはたぶんアペンドモードでオープンしていたのかもしれませんがアペンドモードのことを忘れていて、作者はたぶんアセンブラを知らないのに何でそんなことが可能なのか不思議でした。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

追記 「MS-DOSプロンプト」を起動して、黒いDOS窓で COPY /B a+b c DEL a REN c a の3行を打つと、No.1の回答で説明したプログラムと同じ事をします。 「実はファイル結合ソフトは要らなかった」と言うオチ。 因みに COPY /B a+b+c+d+e f DEL a REN f a で5つのファイルを結合できたりもする。

elngr
質問者

補足

「実はコンベンショナルメモリが足りなかった」と言うオチ。 WinVistaなど知りませんが、黒いDOS窓で2Gを扱うのは無理ではないでしょうか? しかし結合後のファイルサイズが500MBぐらいのものなら僕が作ったソフトより黒いDOS窓でCOPYした方がなぜか高速なのです。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

1.256バイトのバッファを確保する 2.cを新規ファイルでライトオープン 3.aをリードオープン 4.aからバッファに256バイト読んでみる 5.読み込めたバイト数がゼロなら8へ 6.読み込めたバイト数だけバッファをcにライトする 7.4に戻る 8.aをクローズする 9.bをリードオープン 10.bからバッファに256バイト読んでみる 11.読み込めたバイト数がゼロなら14へ 12.読み込めたバイト数だけバッファをcにライトする 13.10に戻る 14.bをクローズする 15.cをクローズする 16.aをファイル削除する 17.cをaにリネームする 18.1で確保したバッファを開放する これで、aとbがどれだけ大きくても大丈夫。使うメモリは256バイトだけ。

elngr
質問者

補足

ありがとうございます。 その方法だとendoffile()かtrunc()何かでaのサイズを減らしてゆかなくてはなりません。減らす方法も僕には思いつきません。 HDDの空きは2.1Gで、既に1.9Gのaと0.1Gのbが既存だとして、aにbを結合させるソフトです。

関連するQ&A

  • 分割された動画ファイルの結合

    動画を配信しているサイトで、ファイルが分割されているところがありますが、「璃樹無」で結合するように書かれていますが、これはWinを対象にしたことなんですよね? Macの場合はどうしたらいいのでしょう? 「璃樹無」に変わるMacようのソフトがあるのでしょうか?また、その結合方法を教えてください。

    • ベストアンサー
    • Mac
  • ファイルの分割・結合で・・・

    ファイルの分割・結合でWIN用でMACで分割されたファイルを結合できるソフトってありますか?結合は単純結合のようなのですが・・・よろしくお願いします。

  • 動画ファイルの結合について・・・

    東芝ダイナブックAX57Aを使用しています。 メモリは2Gです。 Vistaに搭載されている[Ulead DVD Movie Writer]を使用して 二つのAVIファイルを結合するのですが、プレビューで再生しても 音声しかでないのです。 結合する前はちゃんと一つづつ再生できています。 どうしたらうまく結合できるのでしょうか? それから、Windows ムービーメーカでは結合ができないのですがこれもどうしてか教えていただけますでしょうか?

  • 実行ファイルと結合しているファイルは大丈夫?

    実行ファイルでない普通のファイルに実行ファイルが結合されている場合、実行しても大丈夫ですか? たとえば、実行ファイルでないtxtファイルの場合、そのtxtファイルを関連付けられたソフトであるnotepad.exeで開きますが 実行ファイルと結合してしまっているtxtファイルの場合、 このtxtファイルをダブルクリックすると結合された実行ファイルが実行されてしまうのか、 それともtxtファイルをnotepad.exeで開くだけで結合された実行ファイルは実行されないのか 教えてください。 また エクセル、ワードファイルが実行ファイルと結合している場合、どうでしょうか? 実行ファイル(aとする)に実行ファイル(bとする)が結合されている場合は、aを実行した時に同時にbが実行されるのは理解できます。

  • 2つのPDFファイルを結合したい

    こんにちは。 WIN2KでAdobe Acrobat5.0を使用しています。 A4サイズ1ページのa.pdfファイルと同じくb.pdf ファイルを結合してA3サイズのc.pdfファイルを 作成したい(1ページにa.pdfとb.pdfの内容を収 めたい)のですが作成の仕方がわかりません。 どなたかよろしくご教授下さい、お願いします。

  • ファイル結合方法について

    動画ファイルをダウンロードしたのですが、そのファイルが分割されており、拡張子が「dlc」になっているファイルと001-004までの連番になったファイルがあります。これらの結合方法がわかりません。 普段、unite movie、win rarといった結合ソフトを使っているのですが何れもうまくいきません。 専用の結合ソフトがあるのかとも思い、検索してみたのですがよくわかりませんでした。 dlc拡張子のついた分割ファイルを結合する方法をご存知の方がみえましたらアドバイスいただけませんでしょうか。よろしくお願いします。

  • 動画ファイルの結合について

    MPEGかwmyのファイルAとB(A=500k/B=300k)を結合させたいのですが、 やり方がわかりません。どうすれば結合できるのでしょうか? よろしくお願いします。説明下手ですみません<(_ _)>

  • エクセルファイルの結合はどうするの?

    *AとBのエクセルファイルは同書式です (1)AとBのエクセルファイルを結合してA・Bの内容を含んだCのファイルをつくれませんか?(説明不足ですかね)/列だけではなく行も同時に結合?挿入したCのファイルをつくれませんか? (2)AとBのエクセルファイルそれぞれのH列の1500行に数字が入力されてます/ABファイルのH列の1500行のセルには必ずどちらか一方にしか数字は入力されてません/ABを結合?させたH列の新たなCファイルを作りたい

  • 画像結合(一括)

    画像の結合(パノラマ化など)を一括でやってくれるソフトありますか? つまり,ファイル名A1とB1を結合し,ファイル名A2とB2を結合する. というのを一括でやってくれるソフトです. 継ぎ目の自動補正機能はなくても良いです.

  • アセンブラでのメモリの動的確保について

    自作コンパイラのために最近NASMを使ってアセンブラの勉強を始めたものです。 メモリ領域の確保のためにNASMでは buffer: resb 64 と宣言しますが、C++でのchar* buffer=new char[size]; のような、動的なメモリ領域の確保の記述は可能でしょうか? 普段はC++を主に使っているため、見当違いな質問かもしれませんが、よろしくお願いします。

専門家に質問してみよう