1

ZipOutputStream は既存のエントリにデータ ファイルを追加しますか?

こんにちは、asp.net c#、Framework 4.0

Ionic.Zip を使用して圧縮データ ファイル (アップローダー ハンドラー) を飛ばします。

大きなファイルをアップロードします。

ファイルが完全なコンテンツ(チャンクではない)をアップロードした場合-OKですが、ファイルがチャンクでアップロードされた場合...問題が発生します。

すべてのチャンク アップロード ファイルをアーカイブに追加するにはどうすればよいですか (1 つのファイル - 1 つのエントリ)。ファイル自体のドライブを保存せずに。

私の英語でごめんなさい。

私のコードの一部:

長さ = 現在のチャンクで一時ファイルを作成します

using (FileStream fs = new FileStream(Path.Combine(pathToCreate, "chunkfile"), FileMode.Create))
            {
                buffer = new byte[fileUpload.InputStream.Length];
                fileUpload.InputStream.Read(buffer, 0, buffer.Length);
                fs.Write(buffer, 0, buffer.Length);
            }

zip エントリを取得します。

using (ZipFile zipfile = ZipFile.Read(fullpath))
{ 
if (zipfile.ContainsEntry(fileName))
{
zipflag = true;
}
}

Entry が存在する場合 - データを追加し、存在しない場合は新規作成:

if (!zipflag)
            {
                using (ZipFile zipfile = ZipFile.Read(fullpath))
                {
                        using ( FileStream input = new FileStream (Path.Combine(pathToCreate, "chunkfile"), FileMode.Open, FileAccess.Read))
                        {
                            using (FileStream output = new FileStream(fullpath, FileMode.Create, FileAccess.Write))
                            {
                                using (ZipOutputStream zipout = new ZipOutputStream(output))
                                {
                                    buffer = new byte[input.Length];
                                    zipout.PutNextEntry(fileName);
                                    int size;
                                    do
                                    {
                                        size = input.Read(buffer, 0, buffer.Length);
                                        zipout.Write(buffer, 0, size);
                                    } while (size > 0);
                                }
                            }
                        }
                }
            }
            else
            {

                    buffer = FileArray(Path.Combine(pathToCreate, "chunkfile"));
                    AppendAllBytes(fullpath, buffer);
             }
        }
public static void AppendAllBytes(string path, byte[] bytes)
{
   using (var stream = new FileStream(path, FileMode.Append))
     {
        using (ZipOutputStream zipout = new ZipOutputStream(path))
            {
               zipout.Write(bytes, 0, bytes.Length);
            }
     }
}
private byte[] FileArray(string filename)
{
   FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
   // Create a byte array of file stream length
   byte[] datachunk = new byte[fs.Length];

   //Read block of bytes from stream into the byte array
   fs.Read(datachunk, 0, System.Convert.ToInt32(fs.Length));

  //Close the File Stream
  fs.Close();
  return datachunk; //return the byte data
}

この文字列を変数化します。Zip ファイルへのフル パスです。

そして使用しようとしています:

using (var stream = new FileStream(path, FileMode.Append))
    {
        ZipFile zipfile = ZipFile.Read(path);
        using (StreamReader sr = new StreamReader(path))
        {
            var zn = zipfile.UpdateEntry(fileName, bytes);
            sr.Close();
            sr.Dispose();
        }
    }

影響なし、ファイルは更新されません。

助けてください。

4

0 に答える 0