SharpZipLib works well too. seems you are doing something wrong. could you provide your code, where subfolders are not extracted correctly?
Main Topics
Browse All TopicsI am looking for some coding that will have capacity compress all folders, sub folders and its files into a *.CAB file.
I tried :http://www.codeproject.co
and also
http://www.icsharpcode.net
I It only compress folders and all files, sub folders can not.
This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.
Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.
If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.
Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.
Access the answers to your technology questions today.
30-day free trial. Register in 60 seconds.
Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Try it out and discover for yourself.
30-day free trial. Register in 60 seconds.
Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.
Here is all code:
My target is: compress folder : D:\AK.
In this folder have many sub folders, file, and in many subfolder have many files.
But It can not, please help me check.
--------------
using System;
using System.IO;
using System.Text;
using System.Reflection;
using System.Collections;
using System.Runtime.InteropServ
using System.Threading;
// Copy from : http://www.codeproject.com
namespace Demo
{
class CabLibDemo
{
[DllImport("kernel32.dll",
private static extern int GetWindowsDirectory(String
[DllImport("kernel32.dll",
private static extern int GetCurrentDirectory(int MaxCount, StringBuilder s_Text);
[DllImport("kernel32.dll",
private static extern bool SetConsoleTextAttribute(In
[DllImport("kernel32.dll",
private static extern IntPtr GetStdHandle(int u32_Device);
const int GREY = 0x7;
const int WHITE = 0xF;
const int GREEN = 0xA;
const int CYAN = 0xB;
const int RED = 0xC;
const int YELLOW = 0xE;
[STAThread]
static void Main(string[] args)
{
// ######################### SETTINGS MULTITHREAD DEMO ########################
// This demo extracts or compresses 2 huge folders multithreaded at the same time.
// Before setting "true" adapt the paths in the function MultiThread()!
bool b_MultiThreadCompress = false;
// ##########################
// Change this to split the archive into multiple files (200000 --> CAB split size = 200kB)
// ATTENTION: In this case Parameter 1 of CompressFile() MUST contain "%d" or "%02u",...
int s32_SplitSize = 0x7FFFFFFF;
// Store filetimes as UTC in CAB files
bool b_UtcTime = true;
// Encode ANSI or Unicode filenames in CAB file using UTF8. Read the documentation!
bool b_EncodeUtf = true;
// false = Store files uncompressed into CAB
bool b_Compress = true;
// You can specify your own key for CAB encryption here (the longer the more secure, up to 5000 characters)
String s_EncryptionKey = ""; // to handle CAB files without encryption
// String s_EncryptionKey = "AH%KJ/76?KßHÖ\\Äüdghf7(ZT
// ##########################
if (b_MultiThreadCompress)
{
StartThread("Compress1");
StartThread("Compress2");
return;
}
StringBuilder s_WinDir = new StringBuilder(500);
GetWindowsDirectory(s_WinD
String s_Explorer = s_WinDir + "\\Explorer.exe";
//String s_Notepad = s_WinDir + "\\Notepad.exe";
String s_Notepad = "D:\\AK\\";
StringBuilder s_WorkDir = new StringBuilder(500);
GetCurrentDirectory(500, s_WorkDir);
String s_CompressDir = s_WorkDir + "\\_Compressed";
String s_CompressFile = s_CompressDir + "\\Packed_%02d.cab";
CabLib.Compress i_Compress = new CabLib.Compress();
i_Compress.SetEncryptionKe
// this command is not required to set compression = on (which is the default)
// it must only be called to turn it off
i_Compress.SwitchCompressi
// Attach compress event handler
i_Compress.evFilePlaced += new CabLib.Compress.delFilePla
i_Compress.evUpdateStatus += new CabLib.Compress.delUpdateS
// ##########################
// This will pack Explorer.exe and Notepad.exe into a CAB file with subfolders
Print(WHITE, "-------------------------
Print(YELLOW, " CAB FILE COMPRESSION\n");
try
{
ArrayList i_Files = new ArrayList();
i_Files.Add(new string[] { s_Explorer, @"FileManager\Explorer.exe
i_Files.Add(new string[] { s_Notepad, @"D:\AK" });
i_Compress.CompressFileLis
Print(GREEN, "\nSUCCESS: Compressed Explorer.exe and Notepad.exe into cabinet in\n" + s_CompressDir);
}
catch (Exception Ex)
{
Print(RED, Ex.Message);
//goto _RESOURCE;
}
// ##########################
// Under some cirumstances the DOS window disappears immediately, so you cannot read anything!
Print(GREY, "\nHit any key to exit");
Console.Read();
}
/// <summary>
/// The lazy guys at Microsoft forgot to implement coloured text output into .NET framework
/// </summary>
static private void Print(Int16 u16_Color, string s_Format, object o_Param)
{
Print(u16_Color, string.Format(s_Format, o_Param));
}
static private void Print(Int16 u16_Color, string s_Text)
{
const int STD_OUTPUT_HANDLE = -11;
SetConsoleTextAttribute(Ge
Console.WriteLine(s_Text);
}
// ##################### EXTRACT EVENT HANDLER ########################
/// <summary>
/// This event handler is called for every extratced file before it is written to disk
/// return false here if you want a file not to be extracted
/// </summary>
static private bool OnBeforeCopyFile(CabLib.Ex
{
string s_File = k_Info.s_File;
if (s_File[0] > 255) s_File = "Console cannot display Unicode filename.";
Print(GREY, "Callback OnBeforeCopyFile: " + s_File);
return true;
}
// This function will be called when a file has been succesfully extracted.
// If Extraction to Memory is enabled, no file is written to disk,
// instead the entire content of the file is passed in u8_ExtractMem
// If Extraction to Memory is not enabled, u8_ExtractMem is null
private static void OnAfterCopyFile(string s_File, Byte[] u8_ExtractMem)
{
s_File = Path.GetFileName(s_File);
if (s_File[0] > 255) s_File = "Console cannot display Unicode filename.";
Print(GREY, "Callback OnAfterCopyFile: " + s_File);
if (u8_ExtractMem != null)
{
// string s_FileContent = Encoding.ASCII.GetString(u
}
}
private static void OnCabinetInfo(CabLib.Extra
{
Print(GREY, "Callback OnCabinetInfo: " + k_Info.s_Path + k_Info.s_NextCabinet);
}
private static void OnNextCabinet(CabLib.Extra
{
Print(GREY, "Callback OnNextCabinet: " + k_Info.s_Path + k_Info.s_NextCabinet);
}
// ##################### COMPRESS EVENT HANDLER ########################
private static int OnFilePlaced(string s_File, int s32_FileSize, bool bContinuation)
{
Print(GREY, "Callback OnFilePlaced: " + s_File);
return 0;
}
private static int OnUpdateStatus(CabLib.Comp
{
if (k_CurStatus.u32_FolderPer
Print(GREY, "Callback OnUpdateStatus: {0}% completed", k_CurStatus.u32_FolderPerc
return 0;
}
// ##########################
// ##########################
// ##########################
// This is just a demo which compresses 2 huge folders into 2 CAB files at the same time.
// Or it can extract these CAB files into two new folders at the same time.
private static void StartThread(string s_Name)
{
Thread i_Thread = new Thread(new ThreadStart(MultiThread));
i_Thread.Name = s_Name;
i_Thread.Start();
}
private static void MultiThread()
{
// ATTENTION: The folders you compress must contain less than 2GB data!
string s_ComprFolder1 = @"C:\Program Files\Babylon6";
string s_CabFile1 = @"D:\Compressed\Babylon.ca
try
{
CabLib.Compress i_Compress = new CabLib.Compress();
CabLib.Extract i_Extract = new CabLib.Extract();
switch (Thread.CurrentThread.Name
{
case "Compress1":
Print(GREY, "Compressing {0}", s_ComprFolder1);
i_Compress.CompressFolder(
break;
default:
return;
}
Print(GREEN, "Thread {0} exited successfully.", Thread.CurrentThread.Name)
}
catch (Exception Ex)
{
Print(RED, Ex.Message);
Print(YELLOW, Ex.StackTrace);
}
Console.Read();
}
}
}
Sorry, I change this command
ArrayList i_Files = new ArrayList();
i_Files.Add(new string[] { s_Explorer, @"FileManager\Explorer.exe
i_Files.Add(new string[] { s_Notepad, @"D:\AK" });
i_Compress.CompressFileLis
by :
i_Compress.CompressFolder(
For your easy to understand, I delete some code:
Please help me checj this:
using System;
using System.IO;
using System.Text;
using System.Reflection;
using System.Collections;
using System.Runtime.InteropServ
using System.Threading;
// Copy from : http://www.codeproject.com
namespace Demo
{
class CabLibDemo
{
[DllImport("kernel32.dll",
private static extern int GetWindowsDirectory(String
[DllImport("kernel32.dll",
private static extern int GetCurrentDirectory(int MaxCount, StringBuilder s_Text);
[DllImport("kernel32.dll",
private static extern bool SetConsoleTextAttribute(In
[DllImport("kernel32.dll",
private static extern IntPtr GetStdHandle(int u32_Device);
const int GREY = 0x7;
const int WHITE = 0xF;
const int GREEN = 0xA;
const int CYAN = 0xB;
const int RED = 0xC;
const int YELLOW = 0xE;
[STAThread]
static void Main(string[] args)
{
// ######################### SETTINGS MULTITHREAD DEMO ########################
int s32_SplitSize = 0x7FFFFFFF;
// Store filetimes as UTC in CAB files
bool b_UtcTime = true;
// Encode ANSI or Unicode filenames in CAB file using UTF8. Read the documentation!
bool b_EncodeUtf = true;
String s_EncryptionKey = ""; // to handle CAB files without encryption
// ##########################
StringBuilder s_WorkDir = new StringBuilder(500);
GetCurrentDirectory(500, s_WorkDir);
String s_CompressDir = s_WorkDir + "\\_Compressed";
String s_CompressFile = s_CompressDir + "\\Packed_%02d.cab";
// ##########################
Print(WHITE, "-------------------------
Print(YELLOW, " CAB FILE COMPRESSION\n");
try
{
CabLib.Compress i_Compress = new CabLib.Compress();
i_Compress.CompressFolder(
Print(GREEN, "\nSUCCESS: Compressed Explorer.exe and Notepad.exe into cabinet in\n" + s_CompressDir);
}
catch (Exception Ex)
{
Print(RED, Ex.Message);
//goto _RESOURCE;
}
// ##########################
// Under some cirumstances the DOS window disappears immediately, so you cannot read anything!
Print(GREY, "\nHit any key to exit");
Console.Read();
}
#region other
/// <summary>
/// The lazy guys at Microsoft forgot to implement coloured text output into .NET framework
/// </summary>
static private void Print(Int16 u16_Color, string s_Format, object o_Param)
{
Print(u16_Color, string.Format(s_Format, o_Param));
}
static private void Print(Int16 u16_Color, string s_Text)
{
const int STD_OUTPUT_HANDLE = -11;
SetConsoleTextAttribute(Ge
Console.WriteLine(s_Text);
}
#endregion
}
}
i changed the demo project by adding these two lines:
i_Compress.CompressF
i_Extract.E
and removed these lines:
//i_Files.Add(new string[] { s_Explorer, @"FileManager\Explorer.exe
//i_Files.Add(new string[] { s_Notepad, @"TextManager\subfolder\No
//i_Compress.CompressFi
everything works fine. i used the x64 version. which target platform do you use?
I use in windows XP.
Please tell me: your folder: c:\tmp have many sub folders, files in sub folders ? and c:\tmp have many files ?
I mean that: if c:\tmp have file only, it ok.
If c:\tmp have sub folders also, I still be ok.
But when we extract c:\Packed.cab, into c:\tmp\test, we lost all sub folders , don't lost any file.
Did the c:\tmp\test have same tree view as c:\tmp as original ?
Thank, please help me check.
Business Accounts
Answer for Membership
by: vo1dPosted on 2009-11-07 at 06:44:55ID: 25766483
i tested the cablib demo and it works well with subfolders. }); tepad.exe" });
verify it by changing in the demo solution the line:
i_Files.Add(new string[] { s_Notepad, @"TextManager\Notepad.exe"
to
i_Files.Add(new string[] { s_Notepad, @"TextManager\subfolder\No