代码之家  ›  专栏  ›  技术社区  ›  Jatin

压缩c中的每个文件而不是整个目录#

  •  0
  • Jatin  · 技术社区  · 7 年前

    我有一个控制台应用程序,可以生成多个pdf文件。我想要的是把这些单独的pdf文件转换成zip文件。我使用了ZipFile.CreateFromDirectory,但它从目录中压缩了所有文件。有没有方法可以压缩正在生成的每个pdf。

    更新:下面的代码根据Zakk的答案来做我需要的事情。

    static void pdfandzip()
        {
            //Get the data from database into datatable
            string strQuery = ConfigurationManager.AppSettings["sql"];
            SqlCommand cmd = new SqlCommand(strQuery);
            DataTable dt = GetData(cmd);
            int i = 1;
    
            foreach (DataRow r in dt.Rows)
            {
                Document document = new Document();
    
                PdfWriter writer = PdfWriter.GetInstance(document, new FileStream("M://EmpsheetUpload/Pdf/Empsheet" + i + ".pdf", FileMode.Create));
    
                document.Open();
                iTextSharp.text.Font font5 = iTextSharp.text.FontFactory.GetFont(FontFactory.HELVETICA, 5);
    
                PdfPTable table = new PdfPTable(dt.Columns.Count);
    
    
                PdfPRow row = null;
                /*float[] widths = new float[] { 4f, 4f, 4f, 4f, 4f };
    
                table.SetWidths(widths);
    
                table.WidthPercentage = 100; */
                int iCol = 0;
                string colname = "";
                PdfPCell cell = new PdfPCell(new Phrase("EmpSheet"));
    
                cell.Colspan = dt.Columns.Count;
    
                foreach (DataColumn c in dt.Columns)
                {
    
                    table.AddCell(new Phrase(c.ColumnName, font5));
    
                }
    
    
                if (dt.Rows.Count > 0)
                {
                    table.CompleteRow();
                    table.AddCell(new Phrase(r[0].ToString(), font5));
                    table.AddCell(new Phrase(r[1].ToString(), font5));
                    table.AddCell(new Phrase(r[2].ToString(), font5));
                    table.AddCell(new Phrase(r[3].ToString(), font5));
                    table.AddCell(new Phrase(r[4].ToString(), font5));
                    table.AddCell(new Phrase(r[5].ToString(), font5));
                    table.AddCell(new Phrase(r[6].ToString(), font5));
                }
    
                document.Add(table);
                document.Close();
                //ZipFile.CreateFromDirectory(@"M://EmpsheetUpload/Pdf", @"M://EmpsheetUpload/Zip/Empsheet" + i + ".zip");     
                string myPath = @"M:\\EmpsheetUpload\Pdf";
                var files = Directory.EnumerateFiles(myPath);
                foreach (var file in files)
                {
                    var filename = file.Split('\\').Last();
                    var folderName = filename.Substring(0, filename.IndexOf("."));
                    if (Directory.Exists($@"M:\\EmpsheetUpload\Zip1"))
                        Directory.CreateDirectory($@"M:\\EmpsheetUpload\Zip");
                    if (File.Exists($@"M:\\EmpsheetUpload\Pdf\Empsheet"+i+".pdf"))
                        File.Copy(file, $@"M:\\EmpsheetUpload\Zip\Empsheet" + i + ".pdf");
                    if (File.Exists($@"M:\\EmpsheetUpload\Zip\Empsheet" + i + ".pdf"))
                        ZipFile.CreateFromDirectory($@"M:\\EmpsheetUpload\Zip", $@"M:\\EmpsheetUpload\Zip1\Empsheet"+i+".zip");
                    Directory.Delete($@"M:\\EmpsheetUpload\Zip", true);
                    i++;
                }
    
            }
        }
    
    2 回复  |  直到 7 年前
        1
  •  -1
  •   Zakk Diaz    7 年前

    使用Directory.EnumerateFiles并循环遍历每个文件。CreateDirectory(不带扩展名的fileName_)并复制文件。然后压缩目录并清理文件夹。

    在项目中添加对System.IO.Compression.FileSystem.dll的引用

    这样就不需要安装外部库

        static void Main(string[] args)
        {
            string myPath = @"C:\MYFILES";
            var files = Directory.EnumerateFiles(myPath);
            foreach (var file in files)
            {
                var filename = file.Split('\\').Last();
                var folderName = filename.Substring(0, filename.IndexOf("."));
                if (Directory.Exists($@"{myPath}\{folderName}"))
                    Directory.Delete($@"{myPath}\{folderName}", true);
                Directory.CreateDirectory($@"{myPath}\{folderName}");
                if (File.Exists($@"{myPath}\{folderName}\{filename}"))
                    File.Delete($@"{myPath}\{folderName}\{filename}");
                File.Copy(file, $@"{myPath}\{folderName}\{filename}" );
                if(File.Exists($@"{myPath}\{folderName}.zip"))
                    File.Delete($@"{myPath}\{folderName}.zip");
                ZipFile.CreateFromDirectory($@"{myPath}\{folderName}", $@"{myPath}\{folderName}.zip");
                Directory.Delete($@"{myPath}\{folderName}", true);
            }
        }
    
        2
  •  1
  •   Toan Nguyen    7 年前

    你可以用 ZipArchive

    using System;
    using System.IO;
    using System.IO.Compression;
    
    namespace ConsoleApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (FileStream zipToOpen = new FileStream(@"c:\users\exampleuser\release.zip", FileMode.Open))
                {
                    using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
                    {
                        ZipArchiveEntry readmeEntry = archive.CreateEntry("Readme.txt");
                        using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
                        {
                                writer.WriteLine("Information about this package.");
                                writer.WriteLine("========================");
                        }
                    }
                }
            }
        }
    }
    
    推荐文章