@Chalabi

Мне надо взять файл с архива поставить в другую папку и назвать как архив, как мне это сделать C# WPF?

Мне надо взять файл с архива поставить в другую папку и назвать как архив, как мне это сделать
Я смог взять файл из архива, с помощью плагина, если что вот код разархивации:
private void Zip(string zipPath, string extractPath)
        {
            extractPath = System.IO.Path.GetFullPath(extractPath);

            // Гарантирует, что последний символ на пути извлечения
            // - символ-разделитель каталогов.
            // Без этого вредоносный zip-файл может попытаться пройти за пределы ожидаемого
            // путь извлечения.
            if (!extractPath.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal))
                extractPath += System.IO.Path.DirectorySeparatorChar;

            using (ZipArchive archive = ZipFile.OpenRead(zipPath))
            {
                foreach (ZipArchiveEntry entry in archive.Entries)
                {
                    if (entry.FullName.EndsWith(".eps", StringComparison.OrdinalIgnoreCase))
                    {
                        // Получает полный путь, чтобы гарантировать удаление относительных сегментов.
                        string destinationPath = System.IO.Path.GetFullPath(System.IO.Path.Combine(extractPath, entry.FullName));

                        // Порядковое соответствие является наиболее безопасным, тома с учетом регистра могут быть смонтированы в томах, которые
                        // нечувствительны к регистру.
                        if (destinationPath.StartsWith(extractPath, StringComparison.Ordinal))
                            entry.ExtractToFile(destinationPath);
                    }
                }
            }
        }


но мне надо потом этот разархивированный файл переименовать и назвать как название архива, я попробовал:
private void MainMethod()
        {
            string[] pathInIconsFolder = Directory.GetFiles(IconsPath.Text); // Папка с архивами файлов
            string[] testPathFolder = Directory.GetFiles(@"D:\testPath\");//Временная, тестовая папка 

            string testPath = @"D:\testPath"; //Временная, тестовая папка
            string pathInIcons = IconsPath.Text; // Папка с архивами иконок
            string savePathInIcons = SaveIconsPath.Text; //Папка где будут сохраняю файлы

            int c = 0;


            for (int i = 0; i < pathInIconsFolder.Length; i++)
            {
                //Разархивирование и перемещения файла в тестовую папку
                Zip(pathInIconsFolder[i], testPath);
                Thread.Sleep(150);

                if (i == pathInIconsFolder.Length) //Проверка на то что все файлы из pathInIconsFolder перемещаются в тестовую папку testPath
                {
                    DirectoryInfo dir = new DirectoryInfo(pathInIcons);
                    foreach (FileInfo file in dir.GetFiles()) // Получаю имена файлов из папки с архивами
                    {
                        string fileName = file.Name; // Создаю переменную с именем архива 
                        File.Move(testPathFolder[c], savePathInIcons + fileName); // Перемещаю все файлы с тестовой папки на нужную папку и за одно переименовываю файл в имя архива

                        c++; 

                        //Проверяю что все файлы закончились и выхожу из цикла
                        if (c == i)
                            break;
                    }
                }
            }
        }

Как я понимаю программа должна работать, но она только перемещает файлы из архива в тестовую папку.
Надеюсь все понятно объяснил.
Буду благодарен если вы мне поможете
  • Вопрос задан
  • 151 просмотр
Решения вопроса 1
twobomb
@twobomb
public static void UzipOneFile(string zipPath, string directoryOutPath)        {
            var outDir = new DirectoryInfo(directoryOutPath);
            if (!outDir.Exists)
                outDir.Create();

            var archFile = new FileInfo(zipPath);
            if(!archFile.Exists)
                return;
            using (var f = File.Open(archFile.FullName, FileMode.Open)){
                System.IO.Compression.ZipArchive arch = new ZipArchive(f, ZipArchiveMode.Read);
                if (arch.Entries.Count > 0){
                    using (Stream sr = arch.Entries[0].Open()){
                        var ext = "";
                        try{
                            ext = new FileInfo(arch.Entries[0].Name).Extension;
                        }
                        catch (Exception){}
                        using (Stream sw = File.Create(outDir.FullName + "\\" + archFile.Name+ext)){
                            while (true){
                                int data = sr.ReadByte();
                                if(data == -1)
                                    break;
                                sw.WriteByte((byte) data);

                            }
                        }
                    }
                }
            }
        }

//...
UzipOneFile(@"D:\myarch.zip", @"D:\outFolder");

P.S. Нужно добавить ссылку на System.IO.Compression
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы