.net大檔案上傳
ASP.NET上傳檔案用FileUpLoad就可以,但是對檔案夾的操作卻不能用FileUpLoad來實作。
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)
//解壓縮
{
theReg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRar.exe\Shell\Open\Command");
theInfo = @" X " + " " + RARFilePath + RARFileName + " " + UnRARFilePath;
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();
/// 壓縮檔案夾的方法
public void ZipDir(string DirToZip, string ZipedFile, int CompressionLevel)
//壓縮檔案為空時預設與壓縮檔案夾同一級目錄
ZipedFile = DirToZip.Substring(DirToZip.LastIndexOf("\\") + 1);
ZipedFile = DirToZip.Substring(0, DirToZip.LastIndexOf("\\")) +"\\"+ 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);
/// 擷取所有檔案
/// <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;
/// 擷取一個檔案夾下的所有檔案夾裡的檔案
/// <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);
/// 擷取一個檔案夾下的檔案
/// <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);
}
壓縮檔案不能為空!");
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.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;
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>");
本方法經過測試,均已實作。