Я показываю определенные элементы из файлов .xml в DataGridView, и он работает нормально.

Вот код для выбора файлов xml

//Browse Folder
private void Btn_SelectFolder_Click(object sender, EventArgs e)
{
    try
    {
        using (var fbd = new FolderBrowserDialog())
        {
            DialogResult result = fbd.ShowDialog();

            if (result == DialogResult.OK)
            {
                DataTable dt = new DataTable();
                dt.Rows.Clear();
                dt.Columns.Add("Select", typeof(bool));
                dt.Columns.Add("File_Name");
                dt.Columns.Add("Vendor_Name");
                dt.Columns.Add("Vendor_ID");
                dt.Columns.Add("Date_Range", typeof(DateTime));

                lbl_Path.Text = fbd.SelectedPath;
                string[] files = Directory.GetFiles(fbd.SelectedPath, "*.xml");

                XmlDocument doc = new XmlDocument();
                XmlNodeList nodes = doc.GetElementsByTagName("cfdi:Emisor");
                XmlNodeList nodes1 = doc.GetElementsByTagName("cfdi:Comprobante");

                foreach (string tot_file in files)
                {
                    doc.Load(tot_file);
                    string FileName = Path.GetFileNameWithoutExtension(tot_file);

                    for (int i = 0; i < nodes.Count; i++)
                    {
                        string Name = nodes[i].Attributes["Nombre"].Value;
                        string ID = nodes[i].Attributes["Rfc"].Value;
                        string Date = nodes1[i].Attributes["Fecha"].Value;

                        DataRow row = dt.NewRow();
                        row["File_Name"] = FileName;
                        row["Vendor_Name"] = Name;
                        row["Vendor_ID"] = ID;
                        row["Date_Range"] = Date;
                        dt.Rows.Add(row);
                    }
                }

                XML_Grid.DataSource = dt;
                txt_FileName.ReadOnly = false;
                txt_Name.ReadOnly = false;
                txt_ID.ReadOnly = false;
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Теперь я хочу выбрать строки из DataGridView и создать zip-файл выбранных файлов.

Я пробовал этот код для создания zip-файла:

//Create Zip
private void Btn_SaveZip_Click(object sender, EventArgs e)
{
    DialogResult result = saveFileDialog1.ShowDialog();
    if (result == DialogResult.OK)
    {
        string folderToZip = lbl_Path.Text;

        string zipFile = saveFileDialog1.FileName + ".zip";

        using (ZipArchive zipArchive = ZipFile.Open(zipFile, ZipArchiveMode.Create))
        {
            DirectoryInfo di = new DirectoryInfo(folderToZip);
            FileInfo[] filesToArchive = di.GetFiles();

            if (filesToArchive != null && filesToArchive.Length > 0)
            {
                foreach (FileInfo fileToArchive in filesToArchive)
                {
                    zipArchive.CreateEntryFromFile(fileToArchive.FullName, fileToArchive.Name, CompressionLevel.Optimal);
                }
            }
        }
        MessageBox.Show("Zip File Successfully Created", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Question);
    }
}

Приведенный выше код работает нормально и создает zip-файл, но он напрямую проверяет файлы по пути и создает zip-файл для этой папки.

Как выбрать файлы из DataGridview не непосредственно из папки и создать zip-файл выбранных файлов.

Моя форма: введите описание изображения здесь

Любая помощь будет полезна для меня, я уже несколько часов пытаюсь заставить это работать.

0
Usama 23 Сен 2018 в 18:52

1 ответ

Лучший ответ

Если я правильно понял вашу проблему, вы хотите сохранить только те файлы, в которых в таблице данных отмечен столбец Select, в один zip-файл.

Если это так, следующая модификация вашей процедуры сохранения Zip может помочь вам в этом:

using (ZipArchive zipArchive = ZipFile.Open(zipFile, ZipArchiveMode.Create))
{
    List<FileInfo> filesToArchive = new List<FileInfo>();
    DirectoryInfo di = new DirectoryInfo(folderToZip);

    // loop through all of the rows in the data grid
    foreach (DataGridViewRow row in XML_Grid.Rows)
    {
        DataRowView rowView = row.DataBoundItem as DataRowView;
        if (rowView == null) continue; // new row or not bound, ignore
        var selectedValue = rowView["Select"]; // get the value for the select column
        if (selectedValue == DBNull.Value || selectedValue == null || !(bool)selectedValue) // ignore null or false
            continue;

        string fileName = rowView["File_Name"].ToString(); // get the file name
        var files = di.GetFiles(fileName + ".*"); // we had no extension so search the folder to get the full path
        filesToArchive.AddRange(files); // add those file(s) to the list to archive
    }

    if (filesToArchive != null && filesToArchive.Count > 0)
    {
        foreach (FileInfo fileToArchive in filesToArchive)
        {
            zipArchive.CreateEntryFromFile(fileToArchive.FullName, fileToArchive.Name, CompressionLevel.Optimal);
        }
    }
}
0
steve16351 23 Сен 2018 в 17:06