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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public List<string> GetAllFiles(string sDirt)
        {
            List<string> files = new List<string>();
            try
            {
                foreach (string file in Directory.GetFiles(sDirt))
                    if (file.EndsWith(".xml"))
                        files.Add(file); 
                foreach (string fl in Directory.GetDirectories(sDirt))
                    files.AddRange(GetAllFiles(fl));
            }
            catch (Exception ex)
            { Console.WriteLine(ex.Message); }
            return files;
        }



Теперь появилась сложность - вместо папок стали архивы. Что бы посмотреть что внутри архива, использую вот такую штуку:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public static string get_xml(string zipPath)
        {

            string result = "";
            string extractPath = Path.GetFullPath(zipPath);
            if (!extractPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal))
                extractPath += Path.DirectorySeparatorChar;
            using (ZipArchive archive = ZipFile.OpenRead(zipPath))            
                foreach (ZipArchiveEntry entry in archive.Entries)                
                    if (entry.FullName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
                    {
                        string destinationPath = Path.GetFullPath(Path.Combine(extractPath, entry.FullName));
                        if (destinationPath.StartsWith(extractPath, StringComparison.Ordinal))
                        {
                            entry.ExtractToFile(destinationPath);
                        }
                    }
            Console.ReadLine();
            return result;
        }



Проблема: как работать с этим? Либо переводить zip в удобную форму или сравнительную с массивом? Или просто с архивом работать и с файлами внутри него?... тогда как список файлов внутри архива считать и заглянуть в каждый из файликов?
...
Рейтинг: 0 / 0
переход от ZipArchive в List <string>
    #39789132
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bulaolen,
Архив это одно. Парсить-искать это другое.
Не совмещай.
...
Рейтинг: 0 / 0
переход от ZipArchive в List <string>
    #39789149
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bulaolen,

тогда как список файлов внутри архива считать и заглянуть в каждый из файликов?
-----
Вместо:
Код: c#
1.
entry.ExtractToFile(destinationPath);



пользуй
Код: c#
1.
System.IO.Stream s = entry.Oper();



Что делать с потоком сам должен знать.

И, кстати, у тебя нет необходимости делать всю ту навигацию что ты делаешь для файлов - можно получить уже фильтрованный список файлов по маске в корневой и суб-директориях одним вызовом.
...
Рейтинг: 0 / 0
переход от ZipArchive в List <string>
    #39789392
bulaolen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCat,

PinkCat
пользуй
Код: c#
1.
System.IO.Stream s = entry.Oper();



тут точно не опечатка?
попробовал
Код: c#
1.
System.IO.Stream s = entry.Open();


и получил исключения: определения длинны, времени чтения и записи.
Может быть есть другие варианты? Или варианты найти решение этой проблемки?:)
...
Рейтинг: 0 / 0
переход от ZipArchive в List <string>
    #39789454
bulaolen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал вот так реализовать:

Код: 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.
public static string get_xml(string zipPath)
        {

            string result = "";
            string extractPath = Path.GetFullPath(zipPath);
            if (!extractPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal))
                extractPath += Path.DirectorySeparatorChar;
            using (ZipArchive archive = ZipFile.OpenRead(zipPath))
                foreach (ZipArchiveEntry entry in archive.Entries)
                    if (entry.FullName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
                    {
                        string destinationPath = Path.GetFullPath(Path.Combine(extractPath, entry.FullName));
                        if (destinationPath.StartsWith(extractPath, StringComparison.Ordinal))
                        {
                            //parse_xml(extractPath + entry.FullName);
                            //System.IO.Stream s = entry.Open();

                            int Count_Room_Quantity = new int();
                            int Count_MPlase_Quantity = new int();
                            XmlDocument xDoc = new XmlDocument();
                            //xDoc.Load(entry.FullName);
                            xDoc.Load(extractPath + entry.FullName);

                            XmlElement xRoot = xDoc.DocumentElement;
                            foreach (XmlNode xnode in xRoot)
                            {
                                if (xnode.Attributes.Count > 0)
                                {
                                     //
                                }
                            }

                            Console.ReadLine();
                        }
                    }
            return result;
        }



Программа не находит файл внутри архива.
Как же его открыть на чтение? (мне дальше надо будет работать с xml файлами)
...
Рейтинг: 0 / 0
переход от ZipArchive в List <string>
    #39789504
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bulaolen,

Только что перепроверил - все работает - файле извлекся посредством потока.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    using System.IO.Compression;

    [TestClass]
    public class ZipArchive_Tests
    {
        const string zipFilename = @".\Zip\Schemas.zip";
        const string outFilename = @".\Zip\Entries_0.dat";

        [TestMethod]
        public void ZipArchive_Unzip()
        {
            using (Stream stream = new FileStream(zipFilename,FileMode.Open))
            using (ZipArchive archive = new ZipArchive(stream))
            {
                ZipArchiveEntry e = archive.Entries[0];
                System.IO.Stream s = e.Open();
                StreamReader sr = new StreamReader(s);
                File.WriteAllText(outFilename, sr.ReadToEnd());
            }
        }
    }



Но ты, похоже, пользуешься чем-то другим.
...
Рейтинг: 0 / 0
переход от ZipArchive в List <string>
    #39789631
bulaolen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCat, о даа, я сейчас испытал кайф, потому что удалось значительно уменьшить код и он вдобавок заработал!
у меня остался только дин вопрос - куда запись произошла внутрянки файла?

Код: 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.
class ZipArchiveClass
    {
        static void Main(string[] args)
        {
            DirectoryInfo dir = new DirectoryInfo(@"ЖКХ\\");
            foreach (var item in dir.GetFiles())
                if (item.FullName.EndsWith(".zip", StringComparison.OrdinalIgnoreCase))
                    ZipArchive_Unzip(item.FullName);
        }
        
        public static string ZipArchive_Unzip(string item)
        {
            using (Stream stream = new FileStream(item, FileMode.Open))
            using (ZipArchive archive = new ZipArchive(stream))
                foreach (ZipArchiveEntry entry in archive.Entries)
                    if (entry.FullName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
                    {
                        System.IO.Stream s = entry.Open();
                        StreamReader sr = new StreamReader(s);
                        File.WriteAllText(entry.FullName, sr.ReadToEnd());
                    }
            return "содержимое файла";
        }
    }



Вот в этом месте куда запись идет?
Код: c#
1.
File.WriteAllText(entry.FullName, sr.ReadToEnd());
...
Рейтинг: 0 / 0
переход от ZipArchive в List <string>
    #39789642
bulaolen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PinkCat, переформулирую! Как сделать запись не в файл,а в строку для последующей работы? потому что у меня этих архивов больше 2000 и в каждом может быть от 0 до 500 xml файлов... лучше я потрачу время и оперативку, чем насоздаю 2000*500 файлов
...
Рейтинг: 0 / 0
переход от ZipArchive в List <string>
    #39789648
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А есть ли необходимость вообще иметь одновременно все файлы распакованными и загруженными куда-либо?
У меня была задача, где я перебирал папки, внутри них архивы, внутри них xml-файлы, внутри них искал узлы.

Всё делалось через IEnumerable/yield return и в любой конкретный момент был открыт только один файл.

Что касается - куда грузить результат: зачем его грузить в string или файл, если можно сразу открыть поток с помощью XDocument например...
...
Рейтинг: 0 / 0
переход от ZipArchive в List <string>
    #39789665
bulaolen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот я и разобрался с этой темой!

Что бы просмотреть все .zip файлы в директории нужны вот эти 3 строчки (+1 для того, что бы в него заглянуть отдельной процедурой)

Код: c#
1.
2.
3.
4.
            DirectoryInfo dir = new DirectoryInfo(@"ЖКХ\\");
            foreach (var item in dir.GetFiles())
                if (item.FullName.EndsWith(".zip", StringComparison.OrdinalIgnoreCase))
                    ZipArchive_Unzip(item.FullName);



Далее процедура, проходящая через весь архив, и достающая от туда только .xml файлы и записывающий новый .txt файл с данными из всех .xml в архиве и называющимся как архив.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
            string parse_file = "";
            using (Stream stream = new FileStream(item, FileMode.Open))
            using (ZipArchive archive = new ZipArchive(stream))
            {
                foreach (ZipArchiveEntry entry in archive.Entries)
                    if (entry.FullName.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
                    {
                        System.IO.Stream s = entry.Open();
                        StreamReader sr = new StreamReader(s);
                        parse_file = Parse_Xml(sr.ReadToEnd());
                    }
                File.WriteAllText(item.Replace(".zip", ".txt"), parse_file);
            }



Где
Код: c#
1.
Parse_Xml(string item)

- некоторая процедура обработки .xml файла, которая у каждого своя!


Модератор: Отмечено как решение вопроса по просьбе автора :)
...
Рейтинг: 0 / 0
переход от ZipArchive в List <string>
    #39789673
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bulaolen,

а в строку для последующей работы?
-----
Ну у тебя и вопросики, однако...
Поток - получен - дальше крути его как тебе надо - в строку или непосредственно потоком...


Код: c#
1.
Parse_Xml(string item)


or
Код: c#
1.
Parse_Xml(Stream item)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / переход от ZipArchive в List <string>
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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