ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的 *** 作却不能用FileUpLoad来实现。
下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压。
ASP.NET页面设计: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
该类库可以从网上下载。也可以从本链接下载: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 == "") //如果输入为空,则d出提示
{
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/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)