powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / архивирование ZipArchive
13 сообщений из 13, страница 1 из 1
архивирование ZipArchive
    #39690584
Фотография vah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите пожалуйста,

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


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
        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;
        }



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


Заранее благодарен.
...
Рейтинг: 0 / 0
архивирование ZipArchive
    #39690631
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зайдите в свойства файла xlsx книги и посмотрите внизу окна, есть ли кнопка Unlock (Разблокировать)
...
Рейтинг: 0 / 0
архивирование ZipArchive
    #39690688
Фотография vah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesзайдите в свойства файла xlsx книги и посмотрите внизу окна, есть ли кнопка Unlock (Разблокировать)

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

а с txt все Ок.

(
...
Рейтинг: 0 / 0
архивирование ZipArchive
    #39690755
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vahс PDF та же история: ошибка открытия документа

а с txt все Ок.Честно говоря, лень анализировать и тестировать простыню, но раз с txt КАЖЕТСЯ, что все нормально, сравни точную длину файла до упаковки и после распаковки.
...
Рейтинг: 0 / 0
архивирование ZipArchive
    #39690760
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала сравни файл до запаковки с файлом после распаковки. В командной строке
Код: c#
1.
fc /b before.xlsx after.xlsx
...
Рейтинг: 0 / 0
архивирование ZipArchive
    #39690781
Фотография vah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДля начала сравни файл до запаковки с файлом после распаковки. В командной строке
Код: c#
1.
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
...
Рейтинг: 0 / 0
архивирование ZipArchive
    #39690782
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие конкретно получились длины?
Попробуй запаковать и распаковать, не складывая в БД
...
Рейтинг: 0 / 0
архивирование ZipArchive
    #39690822
Фотография vah
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неверно указывал SizeParam.Value
теперь все ок
...
Рейтинг: 0 / 0
архивирование ZipArchive
    #39690938
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть информация, что для работы с XLSX файлами не нужно использовать ZipArchive и архиваторы в целом.
...
Рейтинг: 0 / 0
архивирование ZipArchive
    #39690945
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesесть информация, что для работы с XLSX файлами не нужно использовать ZipArchive и архиваторы в целом.
да, XLSX - это zip-архив. docx тоже
...
Рейтинг: 0 / 0
архивирование ZipArchive
    #39690995
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TRoman Mejtesесть информация, что для работы с XLSX файлами не нужно использовать ZipArchive и архиваторы в целом.
да, XLSX - это zip-архив. docx тоже
используйте библиотеки для работы с OpenXML форматом, а не архиваторы. Формировать самостоятельно XML файлы и упаковывать их в XLSX или распаковывать и читать, это колхоз
...
Рейтинг: 0 / 0
архивирование ZipArchive
    #39691008
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesиспользуйте библиотеки для работы с OpenXML форматом, а не архиваторы. Формировать самостоятельно XML файлы и упаковывать их в XLSX или распаковывать и читать, это колхоз
Это к чему сказано?
Я просто подтвердил что xslx это zip-архив и паковать повторно его бесполезно.
...
Рейтинг: 0 / 0
архивирование ZipArchive
    #39691074
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ просто подтвердил что xslx это zip-архив и паковать повторно его бесполезно.
контейнер без компрессии может иметь смысл
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / архивирование ZipArchive
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]