Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 архивирование ZipArchive  [new]
vah
Member

Откуда:
Сообщений: 2610
Скажите пожалуйста,

архивирую файлы таким образом


        public static string FilesFewZip(string direct, List<int> RowId)
        {
            //Путь к загрузке файла из blob
            string TargetPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CPW");
            string DestFilePath = System.IO.Path.Combine(TargetPath, "Архив_" + direct + ".zip");
            if (!System.IO.Directory.Exists(TargetPath))
            {
                System.IO.Directory.CreateDirectory(TargetPath);
            }
            FileStream fileStream = File.Create(DestFilePath);
            //////////////////////////////
            try
            {
                int PictureCol = 0;  // position of Picture column in DataReader
                int BUFFER_LENGTH = 32768; // chunk size

                using (var connection = new SqlConnection(Connect.str_conn("CPW_files")))
                {

                    // Make sure Photo is non-NULL and return TEXTPTR to it.
                    using (ZipArchive archive = new ZipArchive(fileStream, ZipArchiveMode.Create, true))
                    {

                        foreach (var id in RowId)
                        {

                            SqlCommand cmdGetPointer =
                                new SqlCommand(
                                    "SELECT @Pointer=TEXTPTR(Data), @Length=DataLength(Data), @fileName=[FileName]+'.'+[Extention] FROM Files WHERE RowID=" +
                                    id, connection);
                            SqlParameter PointerOutParam = cmdGetPointer.Parameters.Add("@Pointer", SqlDbType.VarBinary, 100);
                            PointerOutParam.Direction = ParameterDirection.Output;
                            SqlParameter LengthOutParam = cmdGetPointer.Parameters.Add("@Length", SqlDbType.Int);
                            LengthOutParam.Direction = ParameterDirection.Output;
                            SqlParameter fileNameOutParam = cmdGetPointer.Parameters.Add("@fileName", SqlDbType.VarChar, 500);
                            fileNameOutParam.Direction = ParameterDirection.Output;
                            connection.Open();
                            cmdGetPointer.ExecuteNonQuery();

                            SqlCommand cmdReadBinary = new SqlCommand("READTEXT Files.Data @Pointer @Offset @Size HOLDLOCK", connection);
                            SqlParameter PointerParam = cmdReadBinary.Parameters.Add("@Pointer", SqlDbType.Binary, 16);
                            SqlParameter OffsetParam = cmdReadBinary.Parameters.Add("@Offset", SqlDbType.Int);
                            SqlParameter SizeParam = cmdReadBinary.Parameters.Add("@Size", SqlDbType.Int);
                            SqlDataReader dr;
                            //System.IO.FileStream fs = new System.IO.FileStream(DestFilePath, System.IO.FileMode.Create,
                            //    System.IO.FileAccess.Write);
                            int Offset = 0;
                            OffsetParam.Value = Offset;
                            Byte[] Buffer = new Byte[BUFFER_LENGTH];


                            // Read buffer full of data and write to the file stream.


                            if ((Offset + BUFFER_LENGTH) >= System.Convert.ToInt32(LengthOutParam.Value))
                                SizeParam.Value = System.Convert.ToInt32(LengthOutParam.Value) - Offset;
                            else SizeParam.Value = BUFFER_LENGTH;

                            PointerParam.Value = PointerOutParam.Value;

                            dr = cmdReadBinary.ExecuteReader(CommandBehavior.SingleResult);
                            
                            while (dr.Read())
                            {
                                //var record = dr.GetString(0);
                                dr.GetBytes(PictureCol, 0, Buffer, 0, System.Convert.ToInt32(SizeParam.Value));
                                //Archive entry is a file inside archive.
                                ZipArchiveEntry entry = archive.CreateEntry((string)fileNameOutParam.Value, CompressionLevel.Optimal);

                                //Get stream to write the archive item body.
                                using (Stream entryStream = entry.Open())
                                {
                                    //All you need here is to write data into archive item stream.
                                    byte[] recordData = Buffer;//Encoding.Unicode.GetBytes(Buffer);
                                    MemoryStream recordStream = new MemoryStream(recordData);
                                    recordStream.CopyTo(entryStream);

                                    //Flush the archive item to avoid data loss on dispose.
                                    entryStream.Flush();
                                }
                            }
                            dr.Close();
                            connection.Close();
                        }
                    }


                }
            }
            catch (SqlException ex)
            {
                MessageBox.Show(ex.Message);
            }

            return DestFilePath;
        }


почему после разархивирования Экселевского файла и его открытия выдается такая ошибка?


Заранее благодарен.

К сообщению приложен файл. Размер - 33Kb
20 авг 18, 17:18    [21648456]     Ответить | Цитировать Сообщить модератору
 Re: архивирование ZipArchive  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3345
зайдите в свойства файла xlsx книги и посмотрите внизу окна, есть ли кнопка Unlock (Разблокировать)
20 авг 18, 18:06    [21648528]     Ответить | Цитировать Сообщить модератору
 Re: архивирование ZipArchive  [new]
vah
Member

Откуда:
Сообщений: 2610
Roman Mejtes
зайдите в свойства файла xlsx книги и посмотрите внизу окна, есть ли кнопка Unlock (Разблокировать)


с PDF та же история: ошибка открытия документа

а с txt все Ок.

(
20 авг 18, 20:18    [21648641]     Ответить | Цитировать Сообщить модератору
 Re: архивирование ZipArchive  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20320
vah
с PDF та же история: ошибка открытия документа

а с txt все Ок.
Честно говоря, лень анализировать и тестировать простыню, но раз с txt КАЖЕТСЯ, что все нормально, сравни точную длину файла до упаковки и после распаковки.
21 авг 18, 04:48    [21648802]     Ответить | Цитировать Сообщить модератору
 Re: архивирование ZipArchive  [new]
Dima T
Member

Откуда:
Сообщений: 13672
Для начала сравни файл до запаковки с файлом после распаковки. В командной строке
fc /b before.xlsx after.xlsx
21 авг 18, 07:08    [21648814]     Ответить | Цитировать Сообщить модератору
 Re: архивирование ZipArchive  [new]
vah
Member

Откуда:
Сообщений: 2610
Dima T
Для начала сравни файл до запаковки с файлом после распаковки. В командной строке
fc /b before.xlsx after.xlsx



C:\Users\n.v>fc /b C:\Users\nv\Desktop\old.xlsx C:\Users\nv\Desktop\new.xlsx
Сравнение файлов C:\USERS\NV\DESKTOP\old.xlsx и C:\USERS\NV\DESKTOP\NEW.XLSX
FC: C:\USERS\NV\DESKTOP\NEW.XLSX длиннее, чем C:\USERS\NV\DESKTOP\old.xlsx
21 авг 18, 08:28    [21648857]     Ответить | Цитировать Сообщить модератору
 Re: архивирование ZipArchive  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20320
Какие конкретно получились длины?
Попробуй запаковать и распаковать, не складывая в БД
21 авг 18, 08:30    [21648858]     Ответить | Цитировать Сообщить модератору
 Re: архивирование ZipArchive  [new]
vah
Member

Откуда:
Сообщений: 2610
неверно указывал SizeParam.Value
теперь все ок
21 авг 18, 10:04    [21648979]     Ответить | Цитировать Сообщить модератору
 Re: архивирование ZipArchive  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3345
есть информация, что для работы с XLSX файлами не нужно использовать ZipArchive и архиваторы в целом.
21 авг 18, 12:24    [21649282]     Ответить | Цитировать Сообщить модератору
 Re: архивирование ZipArchive  [new]
Dima T
Member

Откуда:
Сообщений: 13672
Roman Mejtes
есть информация, что для работы с XLSX файлами не нужно использовать ZipArchive и архиваторы в целом.

да, XLSX - это zip-архив. docx тоже
21 авг 18, 12:27    [21649291]     Ответить | Цитировать Сообщить модератору
 Re: архивирование ZipArchive  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3345
Dima T
Roman Mejtes
есть информация, что для работы с XLSX файлами не нужно использовать ZipArchive и архиваторы в целом.

да, XLSX - это zip-архив. docx тоже

используйте библиотеки для работы с OpenXML форматом, а не архиваторы. Формировать самостоятельно XML файлы и упаковывать их в XLSX или распаковывать и читать, это колхоз
21 авг 18, 13:19    [21649384]     Ответить | Цитировать Сообщить модератору
 Re: архивирование ZipArchive  [new]
Dima T
Member

Откуда:
Сообщений: 13672
Roman Mejtes
используйте библиотеки для работы с OpenXML форматом, а не архиваторы. Формировать самостоятельно XML файлы и упаковывать их в XLSX или распаковывать и читать, это колхоз

Это к чему сказано?
Я просто подтвердил что xslx это zip-архив и паковать повторно его бесполезно.
21 авг 18, 13:25    [21649408]     Ответить | Цитировать Сообщить модератору
 Re: архивирование ZipArchive  [new]
Изопропил
Member

Откуда:
Сообщений: 31121
Dima T
Я просто подтвердил что xslx это zip-архив и паковать повторно его бесполезно.

контейнер без компрессии может иметь смысл
21 авг 18, 14:08    [21649531]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить