Архивирование каждой строки, используя цикл через массив - PullRequest
2 голосов
/ 02 сентября 2011

В настоящее время я делаю часть программного обеспечения, которая позволит пользователю вводить до 6 каталогов, каждый каталог сохраняется в виде строки (в массиве), затем цикл предназначен для проверки массива, а любой - нет.т. е. фактически назначенный каталог предназначен для архивации в свой собственный архив.Это код, который у меня есть до сих пор.

        private void ZipIt()
        {
        int nxtFileNum = 0;
        string Destination = @"C:\tmpZip" + nxtFileNum + ".zip";
        // Check all fields, check if empty, if not save to Selection array
        // Seems a inefficient - Possibly loop through Text box control type and collect?
        if (String.IsNullOrEmpty(tboxSelect1.Text) == false) { BckupArray[0] = tboxSelect1.Text; };
        if (String.IsNullOrEmpty(tboxSelect2.Text) == false) { BckupArray[1] = tboxSelect2.Text; };
        if (String.IsNullOrEmpty(tboxSelect3.Text) == false) { BckupArray[2] = tboxSelect3.Text; };
        if (String.IsNullOrEmpty(tboxSelect4.Text) == false) { BckupArray[3] = tboxSelect4.Text; };
        if (String.IsNullOrEmpty(tboxSelect5.Text) == false) { BckupArray[4] = tboxSelect5.Text; };
        if (String.IsNullOrEmpty(tboxSelect6.Text) == false) { BckupArray[5] = tboxSelect6.Text; };

        // Create a new ZipFile entity and then loop through each array member, checking if
        // it has an assigned value, if so compress it, if not, skip it.
        using (ZipFile ZipIt = new ZipFile())
        {
            nxtFileNum++;
            foreach (String q in BckupArray)
            {
                if (q != null)
                {
                    ZipIt.AddDirectory(q);
                    ZipIt.Comment = "This archive was created at " + System.DateTime.Now.ToString("G");
                    ZipIt.Save(Destination);
                }
            }
        }        
    }

Что я пытаюсь сделать, так это сохранить первое заданное пользователем местоположение в tmpZip0.7z, второе в tmpZip1.7z и так далее, однако вв данный момент все, что он делает, это добавляет каждый каталог в tmpZip0.zip.


Кроме того, как примечание, как мне заставить его называть каждый архив после каталога, выбранного для архивирования?

В настоящее время я использую DotNetZip (Ionic.Zip) dll.

Надеюсь, я дал достаточно информации, ребята.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2011

Вам нужно переключить некоторые вещи:

foreach (String q in BckupArray)
{
    nxtFileNum++;
    if (q != null)
    {
        using (ZipFile ZipIt = new ZipFile())
        {
            string Destination = @"C:\tmpZip" + nxtFileNum + ".zip";
            ZipIt.AddDirectory(q);
            ZipIt.Comment = "This archive was created at " + 
                            System.DateTime.Now.ToString("G");
            ZipIt.Save(Destination);
        }
    }
}     

Причины:

  1. Строка Destination исправлена ​​после того, как вы ее создали. Это не меняется, только потому что вы увеличиваете nxtFileNum.
  2. Вы создали только один ZipFile и увеличили nxtFileNum только один раз, потому что те были вне вашего foreach цикла
  3. Помещение части, которая создает ZipFile, в if гарантирует, что экземпляр будет создан, только если он действительно используется.
0 голосов
/ 02 сентября 2011

Ну, вы можете сделать это с:

var strings = Controls.OfType<TextBox>()
                      .Select(x => x.Text)
                      .Where(text => !string.IsNullOrEmpty(text))
                      .ToList();

using (ZipFile ZipIt = new ZipFile())
{
    nxtFileNum++;
    string comment = string.Format("This archive was created at {0:G}",
                                   DateTime.Now);
    foreach (string directory in strings)
    {
        ZipIt.AddDirectory(directory);
        ZipIt.Comment = comment;
        ZipIt.Save(Destination + "." + nxtFileNum);
    }
}   

Это, очевидно, вытянет все текстовые поля. Альтернатива - иметь коллекцию типа List<TextBox> или что-то похожее вместо шести разных переменных.

Обратите внимание, что всегда создаст .1, .2, .3 и т. Д., Даже если пользователь не указал первые три имени. Дайте мне знать, если вы хотите быть абсолютно верным позиционированию, которое дал пользователь.

Мне не ясно, что вы действительно должны использовать один и тот же объект ZipFile, кстати. Я ожидаю, что это будет более подходящим:

string comment = string.Format("This archive was created at {0:G}",
                               DateTime.Now);
int fileIndex = 0;
foreach (string directory in strings)
{
    fileIndex++;
    using (ZipFile zipFile = new ZipFile())
    {
        zipFile.AddDirectory(directory);
        zipFile.Comment = comment;
        zipFile.Save(Destination + "." + fileIndex);
    }
}

(Заметьте, кстати, что я переименовал переменные в более условные, кстати, переменные обычно начинаются со строчной буквы.)

...