• ASP.NET上传文件或文件夹并进行压缩及解压


    ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现。

    下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压。

    ASP.NET页面设计:TextBox和Button按钮。

    TextBox中需要自己受到输入文件夹的路径(包含文件夹),通过Button实现选择文件夹的问题还没有解决,暂时只能手动输入。

    两种方法:生成rar和zip。

    1.生成rar

     1 using Microsoft.Win32;
     2 using System.Diagnostics;
     3 protected void Button1Click(object sender, EventArgs e)
     4     {
     5         RAR(@"E:\95413594531\GIS", "tmptest", @"E:\95413594531\");
     6     }
     7     ///
     8    /// 压缩文件
     9    ///
    10    /// 需要压缩的文件夹或者单个文件
    11    /// 生成压缩文件的文件名
    12    /// 生成压缩文件保存路径
    13    ///
    14     protected bool RAR(string DFilePath, string DRARName,string DRARPath)
    15     {
    16         String therar;
    17         RegistryKey theReg;
    18         Object theObj;
    19         String theInfo;
    20         ProcessStartInfo theStartInfo;
    21         Process theProcess;
    22         try
    23         {
    24             theReg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRAR.exe\Shell\Open\Command"); //注:未在注册表的根路径找到此路径
    25             theObj = theReg.GetValue("");
    26             therar = theObj.ToString();
    27             theReg.Close();
    28             therar = therar.Substring(1, therar.Length - 7);
    29             theInfo = " a    " + " " + DRARName + "  " + DFilePath +" -ep1"; //命令 + 压缩后文件名 + 被压缩的文件或者路径
    30             theStartInfo = new ProcessStartInfo();
    31             theStartInfo.FileName = therar;
    32             theStartInfo.Arguments = theInfo;
    33             theStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    34             theStartInfo.WorkingDirectory = DRARPath ; //RaR文件的存放目录。
    35             theProcess = new Process();
    36             theProcess.StartInfo = theStartInfo;
    37             theProcess.Start();
    38             theProcess.WaitForExit();
    39             theProcess.Close();
    40             return true;
    41         }
    42         catch (Exception ex)
    43         {
    44             return false;
    45         }
    46     }
    47  
    48     ///
    49     /// 解压缩到指定文件夹
    50     ///
    51     /// 压缩文件存在的目录
    52     /// 压缩文件名称
    53     /// 解压到文件夹
    54     ///
    55     protected bool UnRAR(string RARFilePath,string RARFileName,string UnRARFilePath)
    56     {
    57         //解压缩
    58         String therar;
    59         RegistryKey theReg;
    60         Object theObj;
    61         String theInfo;
    62         ProcessStartInfo theStartInfo;
    63         Process theProcess;
    64         try
    65          {
    66             theReg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRar.exe\Shell\Open\Command");
    67             theObj = theReg.GetValue("");
    68             therar = theObj.ToString();
    69             theReg.Close();
    70             therar = therar.Substring(1, therar.Length - 7);
    71             theInfo = @" X " + " " + RARFilePath + RARFileName + " " + UnRARFilePath;
    72             theStartInfo = new ProcessStartInfo();
    73             theStartInfo.FileName = therar;
    74             theStartInfo.Arguments = theInfo;
    75             theStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    76             theProcess = new Process();
    77             theProcess.StartInfo = theStartInfo;
    78             theProcess.Start();
    79             return true;
    80         }
    81         catch (Exception ex)
    82          {
    83              return false;
    84          }
    85     }

    注:这种方法在在电脑注册表中未找到应有的路径,未实现,仅供参考。

    2.生成zip

    通过调用类库ICSharpCode.SharpZipLib.dll

    该类库可以从网上下载。也可以从本链接下载:SharpZipLib_0860_Bin.zip

    增加两个类:Zip.cs和UnZip.cs

    (1)Zip.cs

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Web;
      5 
      6 using System.IO;
      7 using System.Collections;
      8 using ICSharpCode.SharpZipLib.Checksums;
      9 using ICSharpCode.SharpZipLib.Zip;
     10 
     11 
     12 namespace UpLoad
     13 {
     14     /// <summary>
     15     /// 功能:压缩文件
     16     /// creator chaodongwang 2009-11-11
     17     /// </summary>
     18     public class Zip
     19     {
     20         /// <summary>
     21         /// 压缩单个文件
     22         /// </summary>
     23         /// <param name="FileToZip">被压缩的文件名称(包含文件路径)</param>
     24         /// <param name="ZipedFile">压缩后的文件名称(包含文件路径)</param>
     25         /// <param name="CompressionLevel">压缩率0(无压缩)-9(压缩率最高)</param>
     26         /// <param name="BlockSize">缓存大小</param>
     27         public void ZipFile(string FileToZip, string ZipedFile, int CompressionLevel)
     28         {
     29             //如果文件没有找到,则报错 
     30             if (!System.IO.File.Exists(FileToZip))
     31             {
     32                 throw new System.IO.FileNotFoundException("文件:" + FileToZip + "没有找到!");
     33             }
     34 
     35             if (ZipedFile == string.Empty)
     36             {
     37                 ZipedFile = Path.GetFileNameWithoutExtension(FileToZip) + ".zip";
     38             }
     39 
     40             if (Path.GetExtension(ZipedFile) != ".zip")
     41             {
     42                 ZipedFile = ZipedFile + ".zip";
     43             }
     44 
     45             ////如果指定位置目录不存在,创建该目录
     46             //string zipedDir = ZipedFile.Substring(0,ZipedFile.LastIndexOf("\\"));
     47             //if (!Directory.Exists(zipedDir))
     48             //    Directory.CreateDirectory(zipedDir);
     49 
     50             //被压缩文件名称
     51             string filename = FileToZip.Substring(FileToZip.LastIndexOf('\\') + 1);
     52             
     53             System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read);
     54             System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);
     55             ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);
     56             ZipEntry ZipEntry = new ZipEntry(filename);
     57             ZipStream.PutNextEntry(ZipEntry);
     58             ZipStream.SetLevel(CompressionLevel);
     59             byte[] buffer = new byte[2048];
     60             System.Int32 size = StreamToZip.Read(buffer, 0, buffer.Length);
     61             ZipStream.Write(buffer, 0, size);
     62             try
     63             {
     64                 while (size < StreamToZip.Length)
     65                 {
     66                     int sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);
     67                     ZipStream.Write(buffer, 0, sizeRead);
     68                     size += sizeRead;
     69                 }
     70             }
     71             catch (System.Exception ex)
     72             {
     73                 throw ex;
     74             }
     75             finally
     76             {
     77                 ZipStream.Finish();
     78                 ZipStream.Close();
     79                 StreamToZip.Close();
     80             }
     81         }
     82 
     83         /// <summary>
     84         /// 压缩文件夹的方法
     85         /// </summary>
     86         public void ZipDir(string DirToZip, string ZipedFile, int CompressionLevel)
     87         {
     88             //压缩文件为空时默认与压缩文件夹同一级目录
     89             if (ZipedFile == string.Empty)
     90             {
     91                 ZipedFile = DirToZip.Substring(DirToZip.LastIndexOf("\\") + 1);
     92                 ZipedFile = DirToZip.Substring(0, DirToZip.LastIndexOf("\\")) +"\\"+ ZipedFile+".zip";
     93             }
     94 
     95             if (Path.GetExtension(ZipedFile) != ".zip")
     96             {
     97                 ZipedFile = ZipedFile + ".zip";
     98             }
     99 
    100             using (ZipOutputStream zipoutputstream = new ZipOutputStream(File.Create(ZipedFile)))
    101             {
    102                 zipoutputstream.SetLevel(CompressionLevel);
    103                 Crc32 crc = new Crc32();
    104                 Hashtable fileList = getAllFies(DirToZip);
    105                 foreach (DictionaryEntry item in fileList)
    106                 {
    107                     FileStream fs = File.OpenRead(item.Key.ToString());
    108                     byte[] buffer = new byte[fs.Length];
    109                     fs.Read(buffer, 0, buffer.Length);
    110                     ZipEntry entry = new ZipEntry(item.Key.ToString().Substring(DirToZip.Length + 1));
    111                     entry.DateTime = (DateTime)item.Value;
    112                     entry.Size = fs.Length;
    113                     fs.Close();
    114                     crc.Reset();
    115                     crc.Update(buffer);
    116                     entry.Crc = crc.Value;
    117                     zipoutputstream.PutNextEntry(entry);
    118                     zipoutputstream.Write(buffer, 0, buffer.Length);
    119                 }
    120             }
    121         }
    122 
    123         /// <summary>
    124         /// 获取所有文件
    125         /// </summary>
    126         /// <returns></returns>
    127         private Hashtable getAllFies(string dir)
    128         {
    129             Hashtable FilesList = new Hashtable();
    130             DirectoryInfo fileDire = new DirectoryInfo(dir);
    131             if (!fileDire.Exists)
    132             {
    133                 throw new System.IO.FileNotFoundException("目录:" + fileDire.FullName + "没有找到!");
    134             }
    135 
    136             this.getAllDirFiles(fileDire, FilesList);
    137             this.getAllDirsFiles(fileDire.GetDirectories(), FilesList);
    138             return FilesList;
    139         }
    140         /// <summary>
    141         /// 获取一个文件夹下的所有文件夹里的文件
    142         /// </summary>
    143         /// <param name="dirs"></param>
    144         /// <param name="filesList"></param>
    145         private void getAllDirsFiles(DirectoryInfo[] dirs, Hashtable filesList)
    146         {
    147             foreach (DirectoryInfo dir in dirs)
    148             {
    149                 foreach (FileInfo file in dir.GetFiles("*.*"))
    150                 {
    151                     filesList.Add(file.FullName, file.LastWriteTime);
    152                 }
    153                 this.getAllDirsFiles(dir.GetDirectories(), filesList);
    154             }
    155         }
    156         /// <summary>
    157         /// 获取一个文件夹下的文件
    158         /// </summary>
    159         /// <param name="strDirName">目录名称</param>
    160         /// <param name="filesList">文件列表HastTable</param>
    161         private void getAllDirFiles(DirectoryInfo dir, Hashtable filesList)
    162         {
    163             foreach (FileInfo file in dir.GetFiles("*.*"))
    164             {
    165                 filesList.Add(file.FullName, file.LastWriteTime);
    166             }
    167         }
    168     }
    169 }


    (2)UnZip.cs

     1 using System.Collections.Generic;
     2 using System.Linq;
     3 using System.Web;
     4 
     5 /// <summary> 
     6 /// 解压文件 
     7 /// </summary> 
     8 
     9 using System;
    10 using System.Text;
    11 using System.Collections;
    12 using System.IO;
    13 using System.Diagnostics;
    14 using System.Runtime.Serialization.Formatters.Binary;
    15 using System.Data;
    16 
    17 using ICSharpCode.SharpZipLib.Zip;
    18 using ICSharpCode.SharpZipLib.Zip.Compression;
    19 using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
    20 
    21 namespace UpLoad
    22 {
    23     /// <summary>
    24     /// 功能:解压文件
    25     /// creator chaodongwang 2009-11-11
    26     /// </summary>
    27     public class UnZipClass
    28     {
    29         /// <summary>
    30         /// 功能:解压zip格式的文件。
    31         /// </summary>
    32         /// <param name="zipFilePath">压缩文件路径</param>
    33         /// <param name="unZipDir">解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param>
    34         /// <param name="err">出错信息</param>
    35         /// <returns>解压是否成功</returns>
    36         public void UnZip(string zipFilePath, string unZipDir)
    37         {
    38             if (zipFilePath == string.Empty)
    39             {
    40                 throw new Exception("压缩文件不能为空!");
    41             }
    42             if (!File.Exists(zipFilePath))
    43             {
    44                 throw new System.IO.FileNotFoundException("压缩文件不存在!");
    45             }
    46             //解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹
    47             if (unZipDir == string.Empty)
    48                 unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));
    49             if (!unZipDir.EndsWith("\\"))
    50                 unZipDir += "\\";
    51             if (!Directory.Exists(unZipDir))
    52                 Directory.CreateDirectory(unZipDir);
    53 
    54             using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath)))
    55             {
    56 
    57                 ZipEntry theEntry;
    58                 while ((theEntry = s.GetNextEntry()) != null)
    59                 {
    60                     string directoryName = Path.GetDirectoryName(theEntry.Name);
    61                     string fileName = Path.GetFileName(theEntry.Name);
    62                     if (directoryName.Length > 0)
    63                     {
    64                         Directory.CreateDirectory(unZipDir + directoryName);
    65                     }
    66                     if (!directoryName.EndsWith("\\"))
    67                         directoryName += "\\";
    68                     if (fileName != String.Empty)
    69                     {
    70                         using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name))
    71                         {
    72 
    73                             int size = 2048;
    74                             byte[] data = new byte[2048];
    75                             while (true)
    76                             {
    77                                 size = s.Read(data, 0, data.Length);
    78                                 if (size > 0)
    79                                 {
    80                                     streamWriter.Write(data, 0, size);
    81                                 }
    82                                 else
    83                                 {
    84                                     break;
    85                                 }
    86                             }
    87                         }
    88                     }
    89                 }
    90             }
    91         }
    92     } 
    93 }

    以上这两个类库可以直接在程序里新建类库,然后复制粘贴,直接调用即可。

    主程序代码如下所示:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Web;
     5 using System.Web.UI;
     6 using System.Web.UI.WebControls;
     7 using System.Drawing;
     8 
     9 using Microsoft.Win32;
    10 using System.Diagnostics;
    11 
    12 
    13 namespace UpLoad
    14 {
    15     public partial class UpLoadForm : System.Web.UI.Page
    16     {
    17         protected void Page_Load(object sender, EventArgs e)
    18         {
    19 
    20         }
    21 
    22         protected void Button1_Click(object sender, EventArgs e)
    23         {
    24             if (TextBox1.Text == "") //如果输入为空,则弹出提示
    25             {
    26                 this.Response.Write("<script>alert('输入为空,请重新输入!');window.opener.location.href=window.opener.location.href;</script>");
    27             }
    28             else
    29             {
    30                 //压缩文件夹
    31                 string zipPath = TextBox1.Text.Trim(); //获取将要压缩的路径(包括文件夹)
    32                 string zipedPath = @"c:\temp"; //压缩文件夹的路径(包括文件夹)
    33                 Zip Zc = new Zip();
    34                 Zc.ZipDir(zipPath, zipedPath, 6);
    35                 this.Response.Write("<script>alert('压缩成功!');window.opener.location.href=window.opener.location.href;</script>");
    36 
    37                 //解压文件夹
    38                 UnZipClass unZip = new UnZipClass();
    39                 unZip.UnZip(zipedPath+ ".zip", @"c:\temp"); //要解压文件夹的路径(包括文件名)和解压路径(temp文件夹下的文件就是输入路径文件夹下的文件)
    40                 this.Response.Write("<script>alert('解压成功!');window.opener.location.href=window.opener.location.href;</script>");
    41 
    42             }
    43         }
    44     }
    45 }


    本方法经过测试,均已实现。

    另外,附上网上下载的参考实例包括源代码,该实例在WinForm下实现:ProgressBar.rar

  • 相关阅读:
    mac 安装了docker,使用命令提示:bash : docker :command not found 的解决办法
    延世韩国语第1册第1课第1节内容提要안녕하십니까?
    延世韩国语第1册第1课第3节内容提要회사원이 아닙니다。会社员不是的(我不是公司职员)
    韩国语字母发音(元音/母音)
    2022年4月10日,随笔18,排名59596。
    延世韩国语第1册第1课第2节内容提要어느 나라 사람입니까?
    requests https忽略证书警告的几种方法
    requests post接口模拟上传文件
    requests 模拟multipart/formdata提交数据方式的方法
    《现代操作系统(中文第四版)》实验一 bash脚本实现cal
  • 原文地址:https://www.cnblogs.com/zhzhx/p/3021077.html
Copyright © 2020-2023  润新知