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:	est", @"e:	est	est.zip"); //压缩
                System.IO.Compression.ZipFile.ExtractToDirectory(@"e:	est	est.zip", @"e:	est"); //解压

            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, @"folder1folder2folder3file2.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:Codesharpcompress.rar"))

                  {

                      var reader = ReaderFactory.Open(stream);

                       while (reader.MoveToNextEntry())

                        {

                            if (!reader.Entry.IsDirectory

                               {

                                Console.WriteLine(reader.Entry.FilePath);

                                 reader.WriteEntryToDirectory(@"C: emp");

                               }

                         }

                   }

          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);
                    }
              }

      

原文地址:https://www.cnblogs.com/zhaoguoying/p/9830628.html