Как поместить каждый zip-файл из исходной папки в целевую папку с помощью функции 7z - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть window form, который содержит две кнопки, позволяющие пользователю выбирать input directory и output directory, как показано ниже.Кроме того, у меня есть fileSystemWatcher для наблюдения за пустой исходной папкой и timer для использования с функцией zip.Пользователь может выбрать каталог (который содержит некоторую подпапку) и щелкнуть start, чтобы создать zip-файл, и он может поместить этот zip-файл в любые каталоги по своему выбору.

enter image description here

результат будет таким:

enter image description here

Однако мне не удалось создать ZIP-файл для выбранного каталогапри использовании 7zip ни одно из имен не совпадает с подкаталогом из исходной папки.Ниже приведен мой код для обработки функции zip с использованием 7zip.

string source = textBoxInput.Text + "\\*";
string[] files = Directory.GetFiles(textBoxInput.Text, "*.7z", SearchOption.AllDirectories);
string target = tBoxOutput.Text + "\\everySingleZipFile"; // the target location only contains zip file from the source location

foreach (var file in files)
{
  // process zip for every file, no idea how to implement it.
  _sevenZip.CreateZipFile(source, target);
}

Вот мой метод 7z

public void CreateZipFile(string sourceName, string targetName)
{
    ProcessStartInfo zipProcess = new ProcessStartInfo();
    zipProcess.FileName = @"E:\Program Files\7-Zip\7z.exe"; // select the 7zip program to start
    zipProcess.Arguments = "a -t7z \"" + targetName + "\" \"" + sourceName + "\" -mx=9";
    zipProcess.WindowStyle = ProcessWindowStyle.Minimized;
    Process zip = Process.Start(zipProcess);
    zip.WaitForExit();
}

Это кнопка, с помощью которой пользователь может выбрать, в какой каталог поместить zipфайл.

private void btnOutput_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog fbd = new FolderBrowserDialog();
        fbd.Description = $"Choose an output path";

        if (fbd.ShowDialog() == DialogResult.OK)
        {
            // show the path in the text box
            tBoxOutput.Text = fbd.SelectedPath;
        }
    }

1 Ответ

0 голосов
/ 04 декабря 2018

РЕДАКТИРОВАТЬ:

основная проблема у вас есть выбор каталога в качестве вывода вместо файла.

Я сделал экран, похожий на ваш

enter image description here

после выбора каталогов для вывода и ввода

enter image description here код событий кнопки обзора:

private void btnBrowseInput_Click(object sender, EventArgs e)
{
    using (var fbd = new FolderBrowserDialog())
    {
        DialogResult result = fbd.ShowDialog();

        if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
        {
            txtInput.Text = fbd.SelectedPath;
        }
    }

}

private void btnBrowseOutput_Click(object sender, EventArgs e)
{
     if (string.IsNullOrEmpty(txtInput.Text))
        {
            MessageBox.Show("Please choose an input folder first");
            return;
        }
        using (var fbd = new FolderBrowserDialog())
        {
            DialogResult result = fbd.ShowDialog();

            if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
            {
                var directoryName = Path.GetFileName(txtInput.Text);
                txtOutput.Text = Path.Combine(fbd.SelectedPath, directoryName + ".7z");
            }
        }

}

и код события кнопки zip:

string zipProgramPath = @"C:\Program Files\7-Zip\7z.exe";

        public Form1()
        {
            InitializeComponent();
        }

        private void btnZip_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtInput.Text) || string.IsNullOrEmpty(txtOutput.Text))
            {
                MessageBox.Show("Choose input directory and output file");
            }
            else
            {
                CreateZipFile(txtInput.Text, txtOutput.Text);
            }
        }
        public void CreateZipFile(string sourceName, string targetName)
        {
            try
            {
                ProcessStartInfo zipProcess = new ProcessStartInfo();
                zipProcess.FileName = zipProgramPath; // select the 7zip program to start
                zipProcess.Arguments = "a -t7z \"" + targetName + "\" \"" + sourceName + "\" -mx=9";
                zipProcess.WindowStyle = ProcessWindowStyle.Minimized;
                zipProcess.UseShellExecute = true;
                Process zip = Process.Start(zipProcess);
                zip.WaitForExit();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
...