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

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

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

vue3里面element 里面如何上传一个文件夹里面嵌套好多文件夹的那种_System

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

两种方法:生成rar和zip。

1.生成rar

using Microsoft.Win32;
using System.Diagnostics;
protected void Button1Click(object sender, EventArgs e)
    {
        RAR(@"E:\95413594531\GIS", "tmptest", @"E:\95413594531\");
    }
    ///
   /// 压缩文件
   ///
   /// 需要压缩的文件夹或者单个文件
   /// 生成压缩文件的文件名
   /// 生成压缩文件保存路径
   ///
    protected bool RAR(string DFilePath, string DRARName,string DRARPath)
    {
        String therar;
        RegistryKey theReg;
        Object theObj;
        String theInfo;
        ProcessStartInfo theStartInfo;
        Process theProcess;
        try
        {
            theReg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRAR.exe\Shell\Open\Command"); //注:未在注册表的根路径找到此路径
            theObj = theReg.GetValue("");
            therar = theObj.ToString();
            theReg.Close();
            therar = therar.Substring(1, therar.Length - 7);
            theInfo = " a    " + " " + DRARName + "  " + DFilePath +" -ep1"; //命令 + 压缩后文件名 + 被压缩的文件或者路径
            theStartInfo = new ProcessStartInfo();
            theStartInfo.FileName = therar;
            theStartInfo.Arguments = theInfo;
            theStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            theStartInfo.WorkingDirectory = DRARPath ; //RaR文件的存放目录。
            theProcess = new Process();
            theProcess.StartInfo = theStartInfo;
            theProcess.Start();
            theProcess.WaitForExit();
            theProcess.Close();
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }
 
    ///
    /// 解压缩到指定文件夹
    ///
    /// 压缩文件存在的目录
    /// 压缩文件名称
    /// 解压到文件夹
    ///
    protected bool UnRAR(string RARFilePath,string RARFileName,string UnRARFilePath)
    {
        //解压缩
        String therar;
        RegistryKey theReg;
        Object theObj;
        String theInfo;
        ProcessStartInfo theStartInfo;
        Process theProcess;
        try
         {
            theReg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRar.exe\Shell\Open\Command");
            theObj = theReg.GetValue("");
            therar = theObj.ToString();
            theReg.Close();
            therar = therar.Substring(1, therar.Length - 7);
            theInfo = @" X " + " " + RARFilePath + RARFileName + " " + UnRARFilePath;
            theStartInfo = new ProcessStartInfo();
            theStartInfo.FileName = therar;
            theStartInfo.Arguments = theInfo;
            theStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            theProcess = new Process();
            theProcess.StartInfo = theStartInfo;
            theProcess.Start();
            return true;
        }
        catch (Exception ex)
         {
             return false;
         }
    }

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

2.生成zip

通过调用类库ICSharpCode.SharpZipLib.dll

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

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

(1)Zip.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
 
using System.IO;
using System.Collections;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
 
 
namespace UpLoad
{
    /// <summary>
    /// 功能:压缩文件
    /// creator chaodongwang 2009-11-11
    /// </summary>
    public class Zip
    {
        /// <summary>
        /// 压缩单个文件
        /// </summary>
        /// <param name="FileToZip">被压缩的文件名称(包含文件路径)</param>
        /// <param name="ZipedFile">压缩后的文件名称(包含文件路径)</param>
        /// <param name="CompressionLevel">压缩率0(无压缩)-9(压缩率最高)</param>
        /// <param name="BlockSize">缓存大小</param>
        public void ZipFile(string FileToZip, string ZipedFile, int CompressionLevel)
        {
            //如果文件没有找到,则报错
            if (!System.IO.File.Exists(FileToZip))
            {
                throw new System.IO.FileNotFoundException("文件:" + FileToZip + "没有找到!");
            }
 
            if (ZipedFile == string.Empty)
            {
                ZipedFile = Path.GetFileNameWithoutExtension(FileToZip) + ".zip";
            }
 
            if (Path.GetExtension(ZipedFile) != ".zip")
            {
                ZipedFile = ZipedFile + ".zip";
            }
 
            如果指定位置目录不存在,创建该目录
            //string zipedDir = ZipedFile.Substring(0,ZipedFile.LastIndexOf("\\"));
            //if (!Directory.Exists(zipedDir))
            //    Directory.CreateDirectory(zipedDir);
 
            //被压缩文件名称
            string filename = FileToZip.Substring(FileToZip.LastIndexOf('\\') + 1);
           
            System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read);
            System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);
            ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);
            ZipEntry ZipEntry = new ZipEntry(filename);
            ZipStream.PutNextEntry(ZipEntry);
            ZipStream.SetLevel(CompressionLevel);
            byte[] buffer = new byte[2048];
            System.Int32 size = StreamToZip.Read(buffer, 0, buffer.Length);
            ZipStream.Write(buffer, 0, size);
            try
            {
                while (size < StreamToZip.Length)
                {
                    int sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);
                    ZipStream.Write(buffer, 0, sizeRead);
                    size += sizeRead;
                }
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
            finally
            {
                ZipStream.Finish();
                ZipStream.Close();
                StreamToZip.Close();
            }
        }
 
        /// <summary>
        /// 压缩文件夹的方法
        /// </summary>
        public void ZipDir(string DirToZip, string ZipedFile, int CompressionLevel)
        {
            //压缩文件为空时默认与压缩文件夹同一级目录
            if (ZipedFile == string.Empty)
            {
                ZipedFile = DirToZip.Substring(DirToZip.LastIndexOf("\\") + 1);
                ZipedFile = DirToZip.Substring(0, DirToZip.LastIndexOf("\\")) +"\\"+ ZipedFile+".zip";
            }
 
            if (Path.GetExtension(ZipedFile) != ".zip")
            {
                ZipedFile = ZipedFile + ".zip";
            }
 
            using (ZipOutputStream zipoutputstream = new ZipOutputStream(File.Create(ZipedFile)))
            {
                zipoutputstream.SetLevel(CompressionLevel);
                Crc32 crc = new Crc32();
                Hashtable fileList = getAllFies(DirToZip);
                foreach (DictionaryEntry item in fileList)
                {
                    FileStream fs = File.OpenRead(item.Key.ToString());
                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                    ZipEntry entry = new ZipEntry(item.Key.ToString().Substring(DirToZip.Length + 1));
                    entry.DateTime = (DateTime)item.Value;
                    entry.Size = fs.Length;
                    fs.Close();
                    crc.Reset();
                    crc.Update(buffer);
                    entry.Crc = crc.Value;
                    zipoutputstream.PutNextEntry(entry);
                    zipoutputstream.Write(buffer, 0, buffer.Length);
                }
            }
        }
 
        /// <summary>
        /// 获取所有文件
        /// </summary>
        /// <returns></returns>
        private Hashtable getAllFies(string dir)
        {
            Hashtable FilesList = new Hashtable();
            DirectoryInfo fileDire = new DirectoryInfo(dir);
            if (!fileDire.Exists)
            {
                throw new System.IO.FileNotFoundException("目录:" + fileDire.FullName + "没有找到!");
            }
 
            this.getAllDirFiles(fileDire, FilesList);
            this.getAllDirsFiles(fileDire.GetDirectories(), FilesList);
            return FilesList;
        }
        /// <summary>
        /// 获取一个文件夹下的所有文件夹里的文件
        /// </summary>
        /// <param name="dirs"></param>
        /// <param name="filesList"></param>
        private void getAllDirsFiles(DirectoryInfo[] dirs, Hashtable filesList)
        {
            foreach (DirectoryInfo dir in dirs)
            {
                foreach (FileInfo file in dir.GetFiles("*.*"))
                {
                    filesList.Add(file.FullName, file.LastWriteTime);
                }
                this.getAllDirsFiles(dir.GetDirectories(), filesList);
            }
        }
        /// <summary>
        /// 获取一个文件夹下的文件
        /// </summary>
        /// <param name="strDirName">目录名称</param>
        /// <param name="filesList">文件列表HastTable</param>
        private void getAllDirFiles(DirectoryInfo dir, Hashtable filesList)
        {
            foreach (FileInfo file in dir.GetFiles("*.*"))
            {
                filesList.Add(file.FullName, file.LastWriteTime);
            }
        }
    }
}

(2)UnZip.cs

using System.Collections.Generic;
using System.Linq;
using System.Web;
 
/// <summary>
/// 解压文件
/// </summary>
 
using System;
using System.Text;
using System.Collections;
using System.IO;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
using System.Data;
 
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
 
namespace UpLoad
{
    /// <summary>
    /// 功能:解压文件
    /// creator chaodongwang 2009-11-11
    /// </summary>
    public class UnZipClass
    {
        /// <summary>
        /// 功能:解压zip格式的文件。
        /// </summary>
        /// <param name="zipFilePath">压缩文件路径</param>
        /// <param name="unZipDir">解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param>
        /// <param name="err">出错信息</param>
        /// <returns>解压是否成功</returns>
        public void UnZip(string zipFilePath, string unZipDir)
        {
            if (zipFilePath == string.Empty)
            {
                throw new Exception("压缩文件不能为空!");
            }
            if (!File.Exists(zipFilePath))
            {
                throw new System.IO.FileNotFoundException("压缩文件不存在!");
            }
            //解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹
            if (unZipDir == string.Empty)
                unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));
            if (!unZipDir.EndsWith("\\"))
                unZipDir += "\\";
            if (!Directory.Exists(unZipDir))
                Directory.CreateDirectory(unZipDir);
 
            using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath)))
            {
 
                ZipEntry theEntry;
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    string directoryName = Path.GetDirectoryName(theEntry.Name);
                    string fileName = Path.GetFileName(theEntry.Name);
                    if (directoryName.Length > 0)
                    {
                        Directory.CreateDirectory(unZipDir + directoryName);
                    }
                    if (!directoryName.EndsWith("\\"))
                        directoryName += "\\";
                    if (fileName != String.Empty)
                    {
                        using (FileStream streamWriter = File.Create(unZipDir + 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;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

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

主程序代码如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
 
using Microsoft.Win32;
using System.Diagnostics;
 
 
namespace UpLoad
{
    public partial class UpLoadForm : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
 
        }
 
        protected void Button1_Click(object sender, EventArgs e)
        {
            if (TextBox1.Text == "") //如果输入为空,则弹出提示
            {
                this.Response.Write("<script>alert('输入为空,请重新输入!');window.opener.location.href=window.opener.location.href;</script>");
            }
            else
            {
                //压缩文件夹
                string zipPath = TextBox1.Text.Trim(); //获取将要压缩的路径(包括文件夹)
                string zipedPath = @"c:\temp"; //压缩文件夹的路径(包括文件夹)
                Zip Zc = new Zip();
                Zc.ZipDir(zipPath, zipedPath, 6);
                this.Response.Write("<script>alert('压缩成功!');window.opener.location.href=window.opener.location.href;</script>");
 
                //解压文件夹
                UnZipClass unZip = new UnZipClass();
                unZip.UnZip(zipedPath+ ".zip", @"c:\temp"); //要解压文件夹的路径(包括文件名)和解压路径(temp文件夹下的文件就是输入路径文件夹下的文件)
                this.Response.Write("<script>alert('解压成功!');window.opener.location.href=window.opener.location.href;</script>");
 
            }
        }
    }
}

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