asp.net 怎么打包文件夹里所有文件,并提示下载保存

asp.net 怎么打包文件夹里所有文件,并提示下载保存,第1张

这个挺简单的,首先思路:

1.获取文件夹下所有文件:根据文件夹获得其下所有的文件有方法Dictionary.GetFiles()

2.根据得到的文件集合打包:对文件压缩解压等建议使用ICSharpCode.SharpZipLib.Zip这个组件。这个比较全面。

3.至于下载保存的话就更简单了,只需要在第2步的时候将生成的文件的路径在数据库中存储,然后页面上绑定该路径即可;然后用户会点击链接,则浏览器会自动d出提示下载保存的。

先下载 ICSharpCode.SharpZipLib.dll

public string cutStr = ""

public void ZipFile(string FileToZip, string ZipedFile, int CompressionLevel, int BlockSize)

{

//如果文件没有找到则报错。

if (!System.IO.File.Exists(FileToZip))

{

throw new System.IO.FileNotFoundException("The specified file " + FileToZip + " could not be found. Zipping aborderd")

}

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("ZippedFile")

ZipStream.PutNextEntry(ZipEntry)

ZipStream.SetLevel(CompressionLevel)

byte[] buffer = new byte[BlockSize]

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

}

ZipStream.Finish()

ZipStream.Close()

StreamToZip.Close()

}

//Get all DirectoryInfo

private void direct(DirectoryInfo di, ref ZipOutputStream s, Crc32 crc)

{

//DirectoryInfo di = new DirectoryInfo(filenames)

DirectoryInfo[] dirs = di.GetDirectories("*")

//遍历目录下面的所有的子目录

foreach (DirectoryInfo dirNext in dirs)

{

//将该目录下的所有文件添加到 ZipOutputStream s 压缩流里面

FileInfo[] a = dirNext.GetFiles()

this.writeStream(ref s, a, crc)

//递归调用直到把所有的目录遍历完成

direct(dirNext, ref s, crc)

}

}

private void writeStream(ref ZipOutputStream s, FileInfo[] a, Crc32 crc)

{

foreach (FileInfo fi in a)

{

//string fifn = fi.FullName

FileStream fs = fi.OpenRead()

byte[] buffer = new byte[fs.Length]

fs.Read(buffer, 0, buffer.Length)

//ZipEntry entry = new ZipEntry(file)

Path.GetFileName(file)

string file = fi.FullName

file = file.Replace(cutStr, "")

ZipEntry entry = new ZipEntry(file)

entry.DateTime = DateTime.Now

// set Size and the crc, because the information

// about the size and crc should be stored in the header

// if it is not set it is automatically written in the footer.

// (in this case size == crc == -1 in the header)

// Some ZIP programs have problems with zip files that don't store

// the size and crc in the header.

entry.Size = fs.Length

fs.Close()

crc.Reset()

crc.Update(buffer)

entry.Crc = crc.Value

s.PutNextEntry(entry)

s.Write(buffer, 0, buffer.Length)

}

}

/// <summary>

/// 压缩指定目录下指定文件(包括子目录下的文件)

/// </summary>

/// <param name="zippath">args[0]为你要压缩的目录所在的路径

/// 例如:D:\\temp\\ (注意temp 后面加 \\ 但是你写程序的时候怎么修改都可以)</param>

/// <param name="zipfilename">args[1]为压缩后的文件名及其路径

/// 例如:D:\\temp.zip</param>

/// <param name="fileFilter">文件过滤, 例如*.xml,这样只压缩.xml文件.</param>

///

public bool ZipFileMain(string zippath, string zipfilename, string fileFilter)

{

try

{

//string filenames = Directory.GetFiles(args[0])

Crc32 crc = new Crc32()

ZipOutputStream s = new ZipOutputStream(File.Create(zipfilename))

s.SetLevel(6)// 0 - store only to 9 - means best compression

DirectoryInfo di = new DirectoryInfo(zippath)

FileInfo[] a = di.GetFiles(fileFilter)

cutStr = zippath.Trim()

//压缩这个目录下的所有文件

writeStream(ref s, a, crc)

//压缩这个目录下子目录及其文件

direct(di, ref s, crc)

s.Finish()

s.Close()

}

catch

{

return false

}

return true

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11523703.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存