c#实现文件夹的上传和下载

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

c#实现⽂件夹的上传和下载
上传⽂件⽤FileUpLoad就可以,但是对⽂件夹的操作却不能⽤FileUpLoad来实现。

下⾯这个⽰例便是使⽤来实现上传⽂件夹并对⽂件夹进⾏压缩以及解压。

页⾯设计:TextBox和Button按钮。

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
该类库可以从⽹上下载。

也可以从本链接下载:
增加两个类: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,stIndexOf("\\"));
//if (!Directory.Exists(zipedDir))
// Directory.CreateDirectory(zipedDir);
//被压缩⽂件名称
string filename = FileToZip.Substring(stIndexOf('\\') + 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(stIndexOf("\\") + 1);
ZipedFile = DirToZip.Substring(0, stIndexOf("\\")) +"\\"+ 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, stWriteTime);
}
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, stWriteTime);
}
}
}
}
(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 pression;
using pression.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();
string fileName = Path.GetFileName();
if (directoryName.Length > 0)
{
Directory.CreateDirectory(unZipDir + directoryName);
}
if (!directoryName.EndsWith("\\"))
directoryName += "\\";
if (fileName != String.Empty)
{
using (FileStream streamWriter = File.Create(unZipDir + ))
{
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>");
}
}
}
}
本⽅法经过测试,均已实现。

欢迎⼊群⼀起讨论:374992201。

相关文档
最新文档