CSharp 超大文件上傳和斷點續傳的實現

ASP.NET上傳文件用FileUpLoad就能夠,可是對文件夾的操做卻不能用FileUpLoad來實現。緩存

下面這個示例即是使用ASP.NET來實現上傳文件夾並對文件夾進行壓縮以及解壓。wordpress

ASP.NET頁面設計:TextBox和Button按鈕。測試

TextBox中須要本身受到輸入文件夾的路徑(包含文件夾),經過Button實現選擇文件夾的問題尚未解決,暫時只能手動輸入。this

兩種方法:生成rar和zip。spa

1.生成rar設計

using Microsoft.Win32;orm

using System.Diagnostics;blog

protected void Button1Click(object sender, EventArgs e)ip

    {get

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

 

            }

        }

    }

}

本方法通過測試,均已實現。

另外,附上另一種上傳文件方法,經測試已實現,參考連接:http://blog.ncmem.com/wordpress/2019/11/20/net%e4%b8%8a%e4%bc%a0%e5%a4%a7%e6%96%87%e4%bb%b6%e7%9a%84%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88/ 


歡迎入羣一塊兒討論:374992201

相關文章
相關標籤/搜索