Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Февраль
0 / 0 / 0
Регистрация: 24.08.2010
Сообщений: 11
1

Работа с ахривами. C#

21.08.2013, 14:03. Просмотров 782. Ответов 1
Метки нет (Все метки)

Подскажите,как распаковать архив с помощью стандартных средств.
Visual Studio 2012
Проект приложения для магазина Windows.

C#

Наверно надо использовать System.IO.Compression.

Только мне не ясно,как там распаковывать. Особенно,если речь идёт об архиве с группой файлов.
Я вот так делаю:

C#
1
2
3
StorageFile downloadfile = await StorageFile.GetFileFromPathAsync(ApplicationData.Current.LocalFolder.Path + "\\download.zip");
Stream zipstream = await downloadfile.OpenStreamForReadAsync();
ZipArchive zip = new ZipArchive(zipstream);
Вроде создал переменную нужного типа.
Я ждал,что можно будет для неё какой-нибудь метод вызвать типа Unzip или Decompress. А вот нет такого метода. Дальше не ясно,как мне файлы и папки достать из этого архива.

System.IO.Compression.FileSystem.dll использовать не получится,т.к. тогда приложение не проходит проверку в Магазине Windows,т.е. эта .dll не разрешена для использования в подобных приложениях(Речь ZipFile и его методе ExtractToDirectory):http://msdn.microsoft.com/ru-ru/library/System.IO.Compression.aspx
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2013, 14:03
Ответы с готовыми решениями:

Нужна летиратура, в которой бы описывались работа с событиями, работа с элементами управления
Помогите пожалуйста найти летиратуру, в которой бы описывались работа с...

Работа формы в фоне, вне фокуса (работа с раскладкой клавиатуры)
Как заставить это работать в фоне? Даный код работает пока форма в фокусе,...

Работа с Меню. Сохранение, печать, создать новый. Работа с рисованием
В общем сабж. Делается программа, которая должная Сохранять, печатать и...

Количество подведенного и отведенного тепла, работа сжатия, работа расширения
Определить количество подведенного и отведенного тепла, работу сжатия, работу...

Работа с файловой системой (системное название некоторых папок и работа со скрытыми документами)
Всем привет, подскажите каким образом можно из VBA сохранить документ txt в...

1
freeba
Неадекват
1269 / 1067 / 204
Регистрация: 02.04.2010
Сообщений: 2,454
Записей в блоге: 2
Завершенные тесты: 2
22.08.2013, 14:57 2
Выдрал из готового проекта. Версия не релизная - требуется "причесать" код. Но думаю разберетесь.
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
97
/// <summary>
        /// Распаковываем архив в указанную директорию. Если указан FileName, то распакуется только указанный файл.
        /// </summary>
        public static async Task<StorageFolder> UnZipFile(string folderName, byte[] data, string FileName = "")
        {
            StorageFolder unZipfolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("current\\" + folderName, CreationCollisionOption.OpenIfExists);
            var stream = new MemoryStream(data);
            var zipArchive = new ZipArchive(stream, ZipArchiveMode.Read);
            foreach (var zipArchiveEntry in zipArchive.Entries)
            {
                if (!String.IsNullOrEmpty(zipArchiveEntry.FullName))
                {
                    if (!zipArchiveEntry.FullName.EndsWith("/"))
                    {
                        String fileName = zipArchiveEntry.FullName.Replace("/", "\\");
                        if (FileName == "")
                        {
                            using (Stream fileData = zipArchiveEntry.Open())
                            {
                                StorageFile newFile = await unZipfolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
                                using (IRandomAccessStream newFileStream = await newFile.OpenAsync(FileAccessMode.ReadWrite))
                                {
                                    using (Stream s = newFileStream.AsStreamForWrite())
                                    {
                                        await fileData.CopyToAsync(s);
                                        await s.FlushAsync();
                                        s.Dispose();
                                    }
                                }
                            }
                        }
                        else
                        {
                            using (Stream fileData = zipArchiveEntry.Open())
                            {
                                if (fileName != FileName) continue;
                                else
                                {
                                    StorageFile newFile = await unZipfolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
                                    using (IRandomAccessStream newFileStream = await newFile.OpenAsync(FileAccessMode.ReadWrite))
                                    {
                                        using (Stream s = newFileStream.AsStreamForWrite())
                                        {
                                            await fileData.CopyToAsync(s);
                                            await s.FlushAsync();
                                            s.Dispose();
                                        }
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            return unZipfolder;
        }
 
        /// <summary>
        /// Возращаем zip-архив (в виде массива байт) указанной папки
        /// </summary>
        public static async Task<byte[]> ZipFolder(StorageFolder folder)
        {
            using (var zipMemoryStream = new MemoryStream())
            {
                using (var zipArchive = new ZipArchive(zipMemoryStream, ZipArchiveMode.Create))
                {
                    await AddZipFolderToEntry(zipArchive, folder, "");
                }
                return zipMemoryStream.ToArray();
            }
        }
 
        /// <summary>
        /// Добавляем папку к архиву
        /// </summary>
        private static async Task<bool> AddZipFolderToEntry(ZipArchive zipArchive, StorageFolder folder, string entryFirst)
        {
            IReadOnlyList<StorageFile> filesToCompress = await folder.GetFilesAsync();
            foreach (StorageFile fileToCompress in filesToCompress)
            {
                Byte[] buffer = await ReadFile(fileToCompress);
                ZipArchiveEntry entry = zipArchive.CreateEntry(entryFirst + fileToCompress.Name);
                using (Stream entryStream = entry.Open())
                {
                    await entryStream.WriteAsync(buffer, 0, buffer.Length);
                }
 
            }
 
            var childrenFolder = await folder.GetFoldersAsync();
            foreach (var storageFolder in childrenFolder)
            {
                await AddZipFolderToEntry(zipArchive, storageFolder, entryFirst + storageFolder.Name + "/");
            }
            return true;
        }
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2013, 14:57

Нужна книга, где рассматриваются работа с прерываниями, указатели, работа с памятью, ассемблерные вставки
Привет всем! Подскажите, пожалуйста, хорошую книгу по C (именно C, не C++)....

Symfony2, работа с типом Collection, работа с базовой формой
Здравствуйте. Осваиваю создание CRUD приложения на Symfony 2, на примере....

Работа с файлом (корректный код, некорректная работа программы)
Для записи и чтения файла использую разные функции. По одиночке они работают...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru