Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Архивация папки 
:(
    Опции темы
CDell
Дата 11.4.2008, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



Народ как заархивировать папку?
Желательно не прибегая к программам WinRAR.
PM MAIL   Вверх
CDell
Дата 11.4.2008, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



Пробую через SharpZipLib.
Нарыл где то код а додумать как бы его заставить архивировать всю папку(все файлы и папки в ней) не могу...

Код

    string[] filenames = Directory.GetFiles("C:\\arh");

Crc32 crc = new Crc32();
ZipOutputStream s = new ZipOutputStream(File.Create("C:\\arh-rar.rar"));
        
s.SetLevel(6); // 0 - store only to 9 - means best compression
        
        foreach (string file in filenames) {
            FileStream fs = File.OpenRead(file);
            
            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);
            ZipEntry entry = new ZipEntry(file);
            
            entry.DateTime = DateTime.Now;

            entry.Size = fs.Length;
            fs.Close();
            
            crc.Reset();
            crc.Update(buffer);
            
            entry.Crc  = crc.Value;
            
            s.PutNextEntry(entry);
            
            s.Write(buffer, 0, buffer.Length);
            
        }

PM MAIL   Вверх
mr.DUDA
Дата 11.4.2008, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Так а в чём проблема? Перечисляем все файлы, добавляем к архиву...


--------------------
user posted image
PM MAIL WWW   Вверх
CDell
Дата 12.4.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 23.6.2007

Репутация: нет
Всего: нет



Да вот в том то и проблема, как  "Перечисляем все файлы, добавляем к архиву"?

PM MAIL   Вверх
mr.DUDA
Дата 12.4.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Вот пример кода из одного старого проекта, думаю можно разобраться:
Код
        static void SaveTo(string outPath)
        {
            try
            {
                // пакуем все файлы в архив
                FileStream fs = new FileStream(outPath, FileMode.Create, FileAccess.Write);
                ZipOutputStream zos = new ZipOutputStream(fs);
                zos.SetLevel(9);

                // имена файлов в русской кодировке пишем в отдельный .txt-файл
                string fileNames = string.Empty;
                int iFile = 0;

                DirectoryInfo di = new DirectoryInfo(Program.ArchiveDir);
                foreach (DirectoryInfo ddi in di.GetDirectories())
                {
                    foreach (DirectoryInfo dddi in ddi.GetDirectories())
                    {
                        foreach (FileInfo fi in dddi.GetFiles())
                        {
                            byte[] content = new byte[0];
                            try
                            {
                                FileStream docFile = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read);
                                content = new byte[docFile.Length];
                                docFile.Read(content, (int)0, (int)docFile.Length);
                                docFile.Close();
                            }
                            catch
                            {
                                DialogResult dr2 = MessageBox.Show(MainForm.Instance, "Файл \'" + fi.Name + "\' невозможно прочитать, скорее всего он открыт в Microsoft Word\nЗакройте все открытые окна Word и повторите попытку\n\nНажмите \'Пропустить\', чтобы проигнорировать этот файл и продолжить\nНажмите \'Отмена\', чтобы отменить сохранение архива.", "Ошибка", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
                                if (dr2 == DialogResult.Cancel)
                                    return;
                                else
                                    continue;
                            }

                            zos.PutNextEntry(new ZipEntry(iFile.ToString() + ".doc"));
                            zos.Write(content, 0, content.Length);
                            iFile++;

                            string russianFileName = ddi.Name + "/" + dddi.Name + "/" + fi.Name;
                            if (fileNames != string.Empty)
                                fileNames += Environment.NewLine;
                            fileNames += russianFileName;
                        }
                    }
                }

                zos.PutNextEntry(new ZipEntry("RussianFileNames.txt"));
                StreamWriter writer = new StreamWriter(zos, Encoding.UTF8);
                writer.Write(fileNames);
                writer.Flush();

                zos.Finish();
                zos.Close();

                MessageBox.Show(MainForm.Instance, "Архив был успешно сохранён в файл:\n" + outPath, "Сохранение завершено", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show(MainForm.Instance, "Не удалось сохранить архив, по причине:\n" + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }





        static void RestoreFrom(string inPath)
        {
            try
            {
                ZipEntry ze;

                // читаем имена в русской кодировке
                string fileNames = string.Empty;
                FileStream fs_tmp = new FileStream(inPath, FileMode.Open, FileAccess.Read);
                ZipInputStream zis_tmp = new ZipInputStream(fs_tmp);
                try
                {
                    while ((ze = zis_tmp.GetNextEntry()) != null)
                    {
                        if (ze.Name == "RussianFileNames.txt")
                        {
                            byte[] buffer = new byte[ze.Size];
                            int pos = 0;
                            int bytesRead;
                            do
                            {
                                bytesRead = zis_tmp.Read(buffer, pos, buffer.Length);
                                pos += bytesRead;
                            }
                            while (bytesRead > 0);

                            MemoryStream ms = new MemoryStream(buffer);
                            fileNames = new StreamReader(ms, Encoding.UTF8).ReadToEnd();
                        }
                    }
                    if (fileNames == string.Empty)
                    {
                        MessageBox.Show(MainForm.Instance, "Указанный файл не содержит архива", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                }
                finally
                {
                    zis_tmp.Close();
                }

                // распаковываем файлы, заменяя старые
                string[] afileNames = fileNames.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
                FileStream fs = new FileStream(inPath, FileMode.Open, FileAccess.Read);
                ZipInputStream zis = new ZipInputStream(fs);
                while ((ze = zis.GetNextEntry()) != null)
                {
                    try
                    {
                        int iFile = int.Parse(ze.Name.Substring(0, ze.Name.Length - 4));
                        string realFileName = afileNames[iFile];
                        string[] segs = realFileName.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
                        string path = Path.Combine(Program.ArchiveDir, segs[0]);
                        if (!Directory.Exists(path))
                            Directory.CreateDirectory(path);
                        path = Path.Combine(path, segs[1]);
                        if (!Directory.Exists(path))
                            Directory.CreateDirectory(path);
                        path = Path.Combine(path, segs[2]);

                        byte[] buffer = new byte[ze.Size];
                        int bytesRead = 0;
                        int pos = 0;
                        do
                        {
                            bytesRead = zis.Read(buffer, pos, buffer.Length);
                            pos += bytesRead;
                        }
                        while (bytesRead > 0);


                        FileStream fsOut = new FileStream(path, FileMode.Create, FileAccess.Write);
                        fsOut.Write(buffer, 0, buffer.Length);
                        fsOut.Close();
                    }
                    catch
                    {
                        continue;
                    }
                }

                zis.Close();

                MessageBox.Show(MainForm.Instance, "Архив был успешно восстановлен из файла:\n" + inPath, "Восстановление завершено", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show(MainForm.Instance, "Не удалось восстановить архив, по причине:\n" + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


З.Ы. SharpZipLib не поддерживает кодировку имён файлов в юникоде, пришлось отдельным файлом сохранять имена файлов в архиве.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0806 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.