Архивирование файлов (Zip)

gersen
Дата: 27.04.2010 07:59:44
Добрый день!
Смотрел на форуме архивирование файлов, но что то не то ....

Я написал свой архиватор но он почему то не совсем корректно работает.

 try
            {
                Encoding encodingWindows1251 = Encoding.GetEncoding("Windows-1251");
                Encoding utf8 = Encoding.UTF8;

                fileName = url + @GridView3.Rows[GridView3.SelectedIndex].Cells[1].Text + ".txt";
                respApp = "application/zip";
                ext = "zip";

                using (StreamReader sr = new StreamReader(fileName, encodingWindows1251, false))
                    text = sr.ReadToEnd();

                Byte[] encodedBytes;
                encodedBytes = utf8.GetBytes(text);
                text = utf8.GetString(encodedBytes);
            }
            catch (Exception ex)
            {
                this.showError("Ошибка чтения файла", ex);
            }
            Response.AddHeader("content-disposition", "attachment;filename=" + GridView3.Rows[GridView3.SelectedIndex].Cells[1].Text + "." + ext);
            Response.Charset = "utf-8";
            Response.ContentEncoding = Encoding.GetEncoding("Windows-1251");
            Response.Cache.SetCacheability(System.Web.HttpCacheability.Public);
            Response.ContentType = respApp;
            Response.Write(text);
            Response.End();
Он архив то создает, Но вот архив не открывается!

Подскажите как быть .... в чем ошибка и как правильно сделать.
Модератор: Отредактировано.
Пользуйтесь тэгом SRC
Зритель с попкорном 5
Дата: 27.04.2010 11:43:00
gersen,

Свои архиваторы, они всегда так :(

Непонятно только почему текст переведённый из 1251 в 1251 через UTF-8 и отданный клиенту в смеси из этих кодировок под расширением zip должен быть меньше размером и открываться деархиватором.
gersen
Дата: 27.04.2010 14:02:34
всем спасибо нашел решение.. решил не создавать велосипед и воспользовался чужим!
 public void CreateSample(string outPathname, List<String> contents, string cucle)
    {

        FileStream fsOut = File.Create(outPathname);
        ZipOutputStream zipStream = new ZipOutputStream(fsOut);

        zipStream.SetLevel(3); //0-9, 9 что является самым высоким уровнем сжатия

       // zipStream.Password = password;    // необязательный

        foreach (string filename in contents)
        {

            string entryName = StrippedFilename(filename);
            ZipEntry newEntry = new ZipEntry(cucle);
            newEntry.DateTime = DateTime.Now;

            // Использование Офф разрешить почтовый быть распакованы XP встроенный в экстрактор и другими взрослыми
            // Код. Использование С или динамический, если файл будет больше, чем 4 ГБ.
            zipStream.UseZip64 = UseZip64.Off;

            zipStream.PutNextEntry(newEntry);

            // распакуйте файл в буфер куски. 4K является оптимальной
            byte[] buffer = new byte[4096];
            FileStream streamReader = File.OpenRead(filename);

            int n;
            long progress = 0;
            do
            {
                n = streamReader.Read(buffer, 0, buffer.Length);
                progress += n;


               // Здесь вы можете делать обновления состояния
               // Прогресс имеет количество байт до сих пор

                zipStream.Write(buffer, 0, n);
            } while (n > 0);
            zipStream.CloseEntry();
        }
        zipStream.IsStreamOwner = true;    // Делает Закрыть Закрыть также основных потока
        zipStream.Close();
    }

    // Удалите диск из названия, например "C:\temp\file.txt" -> "temp\file.txt"
    // Многие утилиты объект на наличие диска в пути.
    
    private string StrippedFilename(string filename)
    {
        string pathroot = Path.GetPathRoot(filename);
        return filename.Substring(pathroot.Length);
    }



тестируем

public void TestBuild() {
    List<String> contents = new List <string>();
    contents.Add(@"c:\temp\test1.txt");
    contents.Add(@"c:\temp\test2.txt");
    contents.Add(@"c:\temp\test3.txt");
    CreateSample(@"c:\temp\empty-test.zip", "whatever", contents);
}