c#中對文件進行解壓同時進行解壓后的數據操作


  這兩天用c#做了一個數據處理的小程序,現在對這個程序以及程序中出現的問題做一個簡單的總結。

  程序描述:該程序主要功能是,對壓縮文件進行解壓,隨后對解壓后的文件進行分析,將特定格式的數據取出放在特定的文件夾中。

  思路:首先將程序進行分析,把需要用到的功能單獨拿出來進行操作(c#剛自學沒多久,對很多功能都不熟悉);

  窗體界面:

      

  功能介紹:

    1、首先是點擊“預覽”鍵選擇需要解壓的文件,並將文件在textBox里面顯示出來,使用的是OpenFileDialog類,code如下:

      OpenFileDialog ofl = new OpenFileDialog();

                if  (ofl.ShowDialog ()==DialogResult .OK ){
                    textBox1.Text = ofl.FileName;

        }

    2、對選中的文件首先進行復制,使用的是FileInfo類,code如下:

       FileInfo f = new FileInfo(textBox1.Text);
                  //獲取路徑下的文件名
                  string text = Path.GetFileName(textBox1.Text);                 
                 //進行復制並對同名文件進行覆蓋。

       f.CopyTo(@"D:\資源\copy\" + text, true);

    3、對文件進行解壓。c#主要是調用類庫。根據不同的文件格式選擇不同的類庫。這里寫幾個這幾天我了解的。

      對.zip文件的解壓(開源):

            1)、微軟在System.IO.Compression命名空間有一些關於文件解壓縮的類,如果只是希望壓縮解壓zip和gzip格式的文件,是個不錯的選擇,在NET                Framework 4.5框架中,原生System.IO.Compression.FileSystem.dll程序集中新增了一個名為ZipFile的類,ZipFile的使用示例如下:

                System.IO.Compression.ZipFile.CreateFromDirectory(@"e:\test", @"e:\test\test.zip"); //壓縮
                System.IO.Compression.ZipFile.ExtractToDirectory(@"e:\test\test.zip", @"e:\test"); //解壓

            2)、SharpZipLib是一個很不錯的C#庫,它能夠解壓縮zip、gzip和tar格式的文件(我在使用是發現他對7-zip壓縮文件進行解壓是會報錯),首先下載               SharpZipLib解壓后,在您的項目中引用ICSharpCode.SharpZLib.dll程序集即可,示例代碼如下:                

                ZipOutputStream zipOutStream = new ZipOutputStream(File.Create("my.zip"));                 CreateFileZipEntry(zipOutStream, "file1.txt", "file1.txt");                 CreateFileZipEntry(zipOutStream, @"folder1\folder2\folder3\file2.txt", "file2.txt");                 zipOutStream.Close();
                Directory.CreateDirectory("ZipOutPut");                  ZipInputStream zipInputStream = new ZipInputStream(File.Open("my.zip", FileMode.Open));                 ZipEntry zipEntryFromZippedFile = zipInputStream.GetNextEntry();                 while (zipEntryFromZippedFile != null)                   {                  if (zipEntryFromZippedFile.IsFile)                    {                    FileInfo fInfo = new FileInfo(string.Format("ZipOutPut\\{0}", zipEntryFromZippedFile.Name));                    if (!fInfo.Directory.Exists) fInfo.Directory.Create();                    FileStream file = fInfo.Create();                    byte[] bufferFromZip = new byte[zipInputStream.Length];                    zipInputStream.Read(bufferFromZip, 0, bufferFromZip.Length);                    file.Write(bufferFromZip, 0, bufferFromZip.Length);                    file.Close();                    }                  zipEntryFromZippedFile = zipInputStream.GetNextEntry();                    }                 zipInputStream.Close();

             3)、SharpCompress的C#框架被開源,它支持:rar 7zip, zip, tar, tzip和bzip2格式的壓縮和解壓,下面的示例直接從rar格式文件讀取並解壓文件。

                using (Stream stream = File.OpenRead(@"C:\Code\sharpcompress.rar"))

                  {

                      var reader = ReaderFactory.Open(stream);

                       while (reader.MoveToNextEntry())

                        {

                            if (!reader.Entry.IsDirectory

                               {

                                Console.WriteLine(reader.Entry.FilePath);

                                 reader.WriteEntryToDirectory(@"C:\temp");

                               }

                         }

                   }

          4)、上面這些是從網上總結的,自己的code如下:

           public static bool UnpackFiles(string file, string dir)
                  {
                      try
                     {
                            if (!Directory.Exists(dir))
                            {
                                Directory.CreateDirectory(dir);
                            }
                          ZipInputStream s = new ZipInputStream(File.OpenRead(file));
                          ZipEntry theEntry;
                          while ((theEntry = s.GetNextEntry()) != null)
                          {
                              string directoryName = Path.GetDirectoryName(theEntry.Name);
                              string fileName = Path.GetFileName(theEntry.Name);
                              if (directoryName != String.Empty)
                              {
                                  Directory.CreateDirectory(dir + directoryName);
                              }
                             if (fileName != String.Empty)
                             {
                                  FileStream streamWriter = File.Create(dir + theEntry.Name);
                                  int size = 2048;
                                  byte[] data = new byte[2048];
                                  while (true)
                                  {
                                      size = s.Read(data, 0, data.Length);
                                      if (size > 0)
                                      {
                                          streamWriter.Write(data, 0, size);
                                      }
                                        else
                                        {
                                            break;
                                        }
                                   }
                                  streamWriter.Close();
                             }
                        }
                        s.Close();
                        return true;
                    }
                    catch (Exception )
                    {
                         throw;              
                    }
                }

      4、對解壓后的文件進行遍歷,找出特定格式的文件進行復制放在特定的文件夾中,code 如下:

        /// <summary>
              /// 遍歷目錄及其子目錄找到自己想要的文件
              /// </summary>
              /// <param name="dirt">源文件路徑</param>
              /// <param name="dis">數據存儲路徑</param>
              /// <param name="type">查找的格式" *.jpg"</param>
              private static void Director(string dirt , string dis,string type)
              {
                    DirectoryInfo dir = new DirectoryInfo(dirt);

            //下面第二個參數表示搜索包含子目錄中的文件;
                    foreach (FileInfo file in dir.GetFiles(type, SearchOption.AllDirectories))
                    {
                          //如果已經有重名文件則對文件進行覆蓋。
                          file.CopyTo(Path.Combine(dis, file.Name),true);
                    }
              }

      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM