0

ファイルを圧縮して送信するファイル転送アプリケーションを作成しようとしています。私の主な目標は、再開可能な転送を提供することでした。そのために、最初にユーザーが送信する必要があるすべてのファイルのアーカイブを作成し、次にストリームでアーカイブを開き、そこからデータのチャンクを読み取りますそのチャンクを圧縮し、受信側で解凍してから、そのデータをより大きなファイルに追加します。これがメイン アーカイブになります。

GZipOutputStream gzipout = new GZipOutputStream(File.Create("abc.zip"));
                //reading and compressing the chunk into abc.zip
                do
                {
                    //f is my filestream for the original archive
                    sourceBytes = f.Read(buffer, 0, buffer.Length);
                    if (sourceBytes == 0)
                    {
                        break;
                    }
                    gzipout.Write(buffer, 0, sourceBytes);
                    bytesread += sourceBytes;
                } while (bytesread < chunklength);
            bytesread = 0;



            gzipout.Finish();
            gzipout.Close();
            //encrypting the chunk
            s.EncryptFile("abc.zip","abc.enc");

            //the chunk is sent over here to the receiving side
            //these are the functions on the receiving side
            //decrypting the chunk
            s.DecryptFile("abc.enc","abc1.zip");

            GZipInputStream gzipin=new GZipInputStream(File.OpenRead("abc1.zip"));
            //the chunk is being decompressed and appended into the original archive file
            FileStream temp = File.Open(Path.GetFileName("originalzip.zip"), FileMode.Append);

            int size = 2048;
            byte[] data = new byte[2048];
            while (true)
            {
                size = gzipin.Read(data, 0, data.Length);
                if (size != 0)
                    temp.Write(data, 0, size);
                else
                    break;
            }
            temp.Flush();
            temp.Close();
        } while (sourceBytes!=0);
        ExtractAll("originalzip.zip", "testest");

問題は、アーカイブをそのまま送信すると機能するため、チャンクプロセスのどこかに問題がありますが、チャンクを作成しようとすると、受信アーカイブのサイズが大きくなり、開くことができません。

編集:修正されました。新しいチャンクを作成する前に、以前に作成したチャンクを削除し、修正しました

4

1 に答える 1

2

問題はコードの 11 行目です。

f.Write(buffer, 0, sourceBytes);

次のように変更する必要があります。

gzipout.Write(buffer, 0, sourceBytes);

これは元のアーカイブを破損し、ファイルの最初から最後までチャンクを追加していると思います (エラーが表示されないのは奇妙です。おそらく、読み取り/書き込みモードで開いたのでしょうか?)。また、abc.zip には変更が加えられていません。実験から残った空でないファイルがここにある可能性があります。その結果、このファイルの複数のコピーを含む受信側のアーカイブが生成されます。

于 2013-11-05T13:10:54.820 に答える