隨着SharpZip LIB我可以很容易地提取從ZIP檔案文件:C#:只提取一個壓縮文件(沒有文件夾)
FastZip fz = new FastZip();
string path = "C:/bla.zip";
fz.ExtractZip(bla,"C:/Unzips/",".*");
然而,這把未壓縮的文件夾中的輸出目錄。 假設我想要的bla.zip中有一個foo.txt文件。有沒有簡單的方法來提取它並將其放置在輸出目錄中(不包含文件夾)?
隨着SharpZip LIB我可以很容易地提取從ZIP檔案文件:C#:只提取一個壓縮文件(沒有文件夾)
FastZip fz = new FastZip();
string path = "C:/bla.zip";
fz.ExtractZip(bla,"C:/Unzips/",".*");
然而,這把未壓縮的文件夾中的輸出目錄。 假設我想要的bla.zip中有一個foo.txt文件。有沒有簡單的方法來提取它並將其放置在輸出目錄中(不包含文件夾)?
FastZip
似乎沒有提供更改文件夾的方法,但是the "manual" way of doing supports this。
如果你看看他們的榜樣:
public void ExtractZipFile(string archiveFilenameIn, string outFolder) {
ZipFile zf = null;
try {
FileStream fs = File.OpenRead(archiveFilenameIn);
zf = new ZipFile(fs);
foreach (ZipEntry zipEntry in zf) {
if (!zipEntry.IsFile) continue; // Ignore directories
String entryFileName = zipEntry.Name;
// to remove the folder from the entry:
// entryFileName = Path.GetFileName(entryFileName);
byte[] buffer = new byte[4096]; // 4K is optimum
Stream zipStream = zf.GetInputStream(zipEntry);
// Manipulate the output filename here as desired.
String fullZipToPath = Path.Combine(outFolder, entryFileName);
string directoryName = Path.GetDirectoryName(fullZipToPath);
if (directoryName.Length > 0)
Directory.CreateDirectory(directoryName);
using (FileStream streamWriter = File.Create(fullZipToPath)) {
StreamUtils.Copy(zipStream, streamWriter, buffer);
}
}
} finally {
if (zf != null) {
zf.IsStreamOwner = true;stream
zf.Close();
}
}
}
當他們注意,而不是寫:
String entryFileName = zipEntry.Name;
你可以寫:
String entryFileName = Path.GetFileName(entryFileName)
刪除的文件夾。
假設你知道這是在zip唯一的文件(不文件夾):
using(ZipFile zip = new ZipFile(zipStm))
{
foreach(ZipEntry ze in zip)
if(ze.IsFile)//must be our foo.txt
{
using(var fs = new FileStream(@"C:/Unzips/foo.txt", FileMode.OpenOrCreate, FileAccess.Write))
zip.GetInputStream(ze).CopyTo(fs);
break;
}
}
如果您需要處理其他的可能性,或如獲取壓縮條目的名稱,複雜性相應地增加。