Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 12.12.2016, 14:24   #11
pu4koff
ПрофессионалФорумчанин
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,496
Репутация: 3616
По умолчанию

Цитата:
Сообщение от ya_yanchik-2909 Посмотреть сообщение
Качайте распаковщик архивов от winrar или 7-zip... - это как?!
Программы, которые распаковывают?! Ну так они установлены уже.

Я хотела то, чтобы программа сама при загрузке распаковывала эти документы, находила Вордовские и формировала в табличку. Чтобы можно было загружать и файлы Word и файлы архива. Возможно ли такое?!
У кого-то винрар установлен, у кого-то 7zip, у кого-то ничего не установлено. Поэтому люди обычно качают unrar или 7z (кому чего больше нравится) и таскают их вместе со своей программой. Если .NET Framework 4.5 и выше, то для zip есть упомянутый вами https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx.
Для 7-zip есть SDK от разработчика: http://www.7-zip.org/sdk.html
Для rar может тоже чего есть. Но большинству лень собирать такой зоопарк на все форматы и проще в фоне через Process.Start запускать консольный 7-zip/winrar с соответствующими параметрами, а там он сам пусть определяет формат и распаковывает куда укажете. Ionic я так понял только для zip-архивов. Можете попробовать вот эту штуку: http://sevenzipsharp.codeplex.com
но давно её не допиливали, забил разработчик на библиотеку похоже.
__________________
http://coub.com/view/2hhtg
pu4koff вне форума   Ответить с цитированием
Старый 13.12.2016, 10:45   #12
ya_yanchik-2909
Форумчанин
 
Регистрация: 15.11.2016
Сообщений: 62
Репутация: 10
По умолчанию

Ionic я так понял только для zip-архивов.

Вот такой еще код нарыла.
Только ошибка "Тип или имя пространства имен "ZipInputStream" не существует в пространстве имен "Ionic" (возможно, отсутствует ссылка на сборку).
Я подключила кстати ссылку "Ionic.Zip.dll".


Код:
private void unZip(string pathSrc, string pathDest)
        {
            try
            {
                using (var fs = File.OpenRead(pathSrc))
                {
                    using (var decompressor = new Ionic.BZip2.BZip2InputStream(fs))
                    {
                        using (var output = File.Create(pathDest))
                        {
                            byte[] buffer = new byte[2048];
                            int n;
                            while ((n = decompressor.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                output.Write(buffer, 0, n);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
А это случайно не для консольного приложения код?!
Пробую все, что вижу (хоть и в чем-то вообще не понимаю, что прописываю) , только пока что безрезультатно.

______________________
Используйте тег [CODE] при вставке кода на форум ([CODE]код[/CODE]).

Последний раз редактировалось Alex11223; 13.12.2016 в 11:04.
ya_yanchik-2909 вне форума   Ответить с цитированием
Старый 13.12.2016, 10:53   #13
pu4koff
ПрофессионалФорумчанин
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,496
Репутация: 3616
По умолчанию

Если .NET Framework 4.5 и выше, то для zip не нужны никакие ионики.
Вот пример поиска текстовых файлов в zip архиве:
https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx
__________________
http://coub.com/view/2hhtg
pu4koff вне форума   Ответить с цитированием
Старый 13.12.2016, 10:57   #14
ya_yanchik-2909
Форумчанин
 
Регистрация: 15.11.2016
Сообщений: 62
Репутация: 10
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Если .NET Framework 4.5 и выше, то для zip не нужны никакие ионики.
В том то и дело, что .NET Framework 4.0, если выше, то не будет работать на XP.
ya_yanchik-2909 вне форума   Ответить с цитированием
Старый 13.12.2016, 11:11   #15
Alex11223
Модератор
Заслуженный модератор
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,288
Репутация: 3739

icq: 512-765
skype: alexp.frl
По умолчанию

Цитата:
Сообщение от ya_yanchik-2909 Посмотреть сообщение
Пробую все, что вижу (хоть и в чем-то вообще не понимаю, что прописываю) , только пока что безрезультатно.
Так не получится достичь нормальных результатов (особенно если еще надо, чтоб программа "не ломалась", как упомянуто в предыдущей теме), надо разобраться, а не копипастить все подряд.

Если нужны все форматы (zip, rar, 7z, ..) и если архивы небольшого размера, то наверно проще всего брать 7-zip и запускать его для распаковки.
Alex11223 на форуме   Ответить с цитированием
Старый 13.12.2016, 12:26   #16
ya_yanchik-2909
Форумчанин
 
Регистрация: 15.11.2016
Сообщений: 62
Репутация: 10
По умолчанию

[QUOTE=Alex11223;1651881]Так не получится достичь нормальных результатов (особенно если еще надо, чтоб программа "не ломалась", как упомянуто в предыдущей теме), надо разобраться, а не копипастить все подряд.
Написала такой код:

Код:
        private void button8_Click(object sender, EventArgs e)
        {
            {
                string zipPath = @"C:\test\test.zip";
                string extractPath = @"C:\test\testfolder";
                Ionic.ZipFile.ExtractToDirectory(zipPath, extractPath); 

                Process proc1 = Process.Start("WinRAR.exe", @"e F:\нов \in\*.* F:\нов\участки");
                proc1.WaitForExit();       //  //
                string[] arch = Directory.GetFiles(@"F:\нов");

                for (int i = 0; i < arch.Length; i++)
                {
                    string archName = Path.GetFileName(arch[i]);
                    Process proc = Process.Start("WinRAR.exe", "e" + @"F:\нов" + archName + @"F:\нов\участки");
                    proc.WaitForExit();
                    Directory.Move(@"F:\нов\участки", @"F:\нов" + "" + Path.GetFileNameWithoutExtension(arch[i]));

                }
            }
        }
Но выводит ошибки (скрины).

1) При нажатии на кнопку "Button 8".
2) Нажимаю "Закрыть" появляется диалоговое окно.
3) Далее сразу появляется ошибка (рис.3).
Рис 2 и 3 поменялись местами! Наоборот.
Миниатюры
Нажмите на изображение для увеличения
Название: буттон8.jpg
Просмотров: 89
Размер:	99.6 Кб
ID:	85051   Нажмите на изображение для увеличения
Название: 3ошибка.jpg
Просмотров: 96
Размер:	120.7 Кб
ID:	85056  
Изображения
 

Последний раз редактировалось ya_yanchik-2909; 13.12.2016 в 12:29.
ya_yanchik-2909 вне форума   Ответить с цитированием
Старый 13.12.2016, 12:33   #17
pu4koff
ПрофессионалФорумчанин
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,496
Репутация: 3616
По умолчанию

Цитата:
Сообщение от ya_yanchik-2909 Посмотреть сообщение
В том то и дело, что .NET Framework 4.0, если выше, то не будет работать на XP.
От нечего делать родил такую вот наркоманию:
Код:
            var psi = new ProcessStartInfo();
            psi.FileName = @"D:\temp\7z.exe"; // можно закинуть файл из состава 7-zip в папку со своей программой и писать просто 7z.exe
            psi.Arguments = @" l "; // пробелы важны. l означает, что нужен список файлов архива
            psi.Arguments += @"D:\temp\temp.zip"; // имя файла архива. лучше завернуть в кавычки, иначе будут проблемы с путями, в которых есть пробелы
            psi.Arguments += @" *.doc *.docx *.rtf "; // файлы каких форматов нужны
            psi.Arguments += @"-r -slt"; // r означает, что нужно заглядывать в папки, которые есть в архиве. slt - подробный вывод, чтобы проще было вытаскивать имя файла
            psi.WindowStyle = ProcessWindowStyle.Hidden;
            psi.RedirectStandardOutput = true;
            psi.UseShellExecute = false;
            psi.StandardOutputEncoding = Encoding.GetEncoding(866);
            var process = Process.Start(psi);
            process.WaitForExit();

            List<string> files = new List<string>();

            string line;
            using (var reader = process.StandardOutput)
            {
                do
                {
                    line = reader.ReadLine();
                }
                while (line != null && line != "----------"); // после строки из чёрточек пойдёт перечень файлов, можно начинать вытаскивать имена файлов
                
                while (line != null)
                {
                    if (line.StartsWith("Path = ")) // имя файла в строке, которая начинается с Path =
                    {
                        files.Add(line.Substring("Path = ".Length));
                    }
                                        
                    line = reader.ReadLine();
                }
            }
в результате в files будет список имён файлов. Есть в архиве вложенные папки, то в имени будет и папка фигурировать, типа: Новая папка\имя файла.doc
Если с вордовскими файлами из архива что-то нужно сразу делать или они будут заведомо нужны, то можно сразу запускать архиватор с ключом e, чтобы извлекал файлы, а не выводил их список. Тогда и имена файлов вырезать не нужно будет таким вот колхозным способом. Ключом -o задаётся папка для сохранения разархивированных документов. ключ -aot автоматом будет переименовывать извлекаемые файлы, если уже есть файл с таким именем.
__________________
http://coub.com/view/2hhtg

Последний раз редактировалось pu4koff; 13.12.2016 в 12:44.
pu4koff вне форума   Ответить с цитированием
Старый 13.12.2016, 12:42   #18
Alex11223
Модератор
Заслуженный модератор
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,288
Репутация: 3739

icq: 512-765
skype: alexp.frl
По умолчанию

Так написано ж все в ошибке. Вы зачем-то пытаетесь использовать папку F:\нов (видимо несуществующую) вместо своего zipPath
Alex11223 на форуме   Ответить с цитированием
Старый 13.12.2016, 12:53   #19
ya_yanchik-2909
Форумчанин
 
Регистрация: 15.11.2016
Сообщений: 62
Репутация: 10
По умолчанию

1) Здесь я пишу путь, где лежит сам проект с файлом 7z.exe?

Цитата:
Сообщение от pu4koff Посмотреть сообщение
psi.FileName = @"F:\12 дек\копия\7z.exe"; // можно закинуть файл из состава 7-zip в папку со своей программой и писать просто 7z.exe
2)Это из какой папки беру архивы? Вот так? А temp - это что такое?!

psi.Arguments += @"F:\нов\temp.zip"; // имя файла архива. лучше завернуть в кавычки, иначе будут проблемы с путями, в которых есть пробелы

3) То, что вы дописалИ, сложно понять, можно попросит еще раз объяснить, только на русской языке)) С каким ключом?
Ну получается я загружаю документы вордовские и данные необходимые читаются из самого документа и записываются в таблицу (Напр. ФИО, №) и все.
ya_yanchik-2909 вне форума   Ответить с цитированием
Старый 13.12.2016, 13:01   #20
pu4koff
ПрофессионалФорумчанин
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,496
Репутация: 3616
По умолчанию

Обернул в метод:
Код:
        IEnumerable<string> GetDocuments(string path7z, string archive)
        {
            var psi = new ProcessStartInfo();
            psi.FileName = path7z;
            psi.Arguments = @" l ";
            psi.Arguments += "\"" + archive + "\"";
            psi.Arguments += @" *.doc *.docx *.rtf ";
            psi.Arguments += @"-r -slt";
            psi.WindowStyle = ProcessWindowStyle.Hidden;
            psi.RedirectStandardOutput = true;
            psi.UseShellExecute = false;
            psi.StandardOutputEncoding = Encoding.GetEncoding(866);
            var process = Process.Start(psi);
            process.WaitForExit();

            List<string> files = new List<string>();

            string line;
            using (var reader = process.StandardOutput)
            {
                do
                {
                    line = reader.ReadLine();
                }
                while (line != null && line != "----------");

                while (line != null)
                {
                    if (line.StartsWith("Path = "))
                    {
                        files.Add(line.Substring("Path = ".Length));
                    }

                    line = reader.ReadLine();
                }
            }

            return files;
        }
path7z - путь к файлу 7z.exe. Если 7-zip установлен, то можно передавать C:\Program Files\7-zip\7z.exe. Если будете таскать со своей программой, то просто 7z.exe. Или любой другой путь, чтобы файл нашёлся в итоге. Лучше таскать с собой, чтобы заодно зафиксировать версию и формат вывода, а то колхозный парсинг поломается
archive - путь к архиву. "C:\test\test.zip" или в каком архиве документы искать будете.
__________________
http://coub.com/view/2hhtg

Последний раз редактировалось pu4koff; 13.12.2016 в 13:04.
pu4koff вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему тормозит распаковка tar-архивов в Windows? R_G Windows 4 27.01.2016 21:37
Создание распаковщика архивов. crymchanin Общие вопросы C/C++ 1 01.02.2012 13:38
Распаковка архивов Starscream Общие вопросы Delphi 2 25.06.2009 23:26
Использование MPQ архивов Smitt64 Общие вопросы C/C++ 0 27.02.2009 19:18
Восстановители архивов DM_bite Софт 5 08.08.2008 11:13


09:21.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.