如何使用SSIS脚本任务C#2005或2008解压缩包含多个文件的文件夹?

我的项目中有一项要求我需要解压缩一些zip文件夹。 我用google搜索并且在不使用外部库的情况下知道我无法实现这一点,或者使用GzipStream类我们可以解压缩.gz文件。

有没有什么办法可以在不使用任何外部库的情况下解压缩?

PS:我只需要使用脚本任务组件,而.Net框架是3.0。

提前致谢。

A)将变量FileName声明为字符串数据类型

B)使用ForEach循环遍历文件夹中的文件并将文件名映射到FileName变量

C)使用执行进程任务压缩/解压缩到单个文件

D)执行包

有关steb by step简短指南,请参阅http://sqlserversolutions.blogspot.com/2008/10/zip-and-unzip-files-in-folder.html

您可能还想查看此http://gallery.technet.microsoft.com/Unzipping-with-SSIS-Script-6b055183

我不想使用7zip方法或外部库,因为这使得部署SSIS包稍微复杂一些。 所以我采用了与@StackTrace引用的Gallery脚本类似的方法,并在 此处和此处进行了说明 。 我已经有一个脚本任务执行其他逻辑,所以我只需要C#代码来执行它。 我发现脚本任务是在MTA线程上执行的,但Shell32代码需要使用STA线程执行,所以我最终得到了这段代码。 希望能帮助别人:

 ///  /// Ugh! SSIS runs script tasks on MTA threads but Shell32 only wants to /// run on STA thread. So start a new STA thread to call UnZip, block /// till it's done, then return. /// We use Shell32 since .net 2 doesn't have ZipFile and we prefer not to /// ship other dlls as they normally need to be deployed to the GAC. So this /// is easiest, although not very pretty. ///  /// File to unzip /// Folder to put the unzipped files public static void UnZipFromMTAThread(string zipFile, string folderPath) { object[] args = new object[] { zipFile, folderPath }; if (Thread.CurrentThread.GetApartmentState() == ApartmentState.STA) { UnZip(args); } else { Thread staThread = new Thread(new ParameterizedThreadStart(UnZip)); staThread.SetApartmentState(ApartmentState.STA); staThread.Start(args); staThread.Join(); } } ///  /// From http://www.fluxbytes.com/csharp/unzipping-files-using-shell32-in-c/ but with /// args packed in object array so can be called from new STA Thread in UnZipFromMTAThread(). ///  /// object array containing: [string zipFile, string destinationFolderPath] public static void UnZip(object param) { object[] args = (object[]) param; string zipFile = (string)args[0]; string folderPath = (string)args[1]; if (!File.Exists(zipFile)) throw new FileNotFoundException(); if (!Directory.Exists(folderPath)) Directory.CreateDirectory(folderPath); Shell32.Shell objShell = new Shell32.Shell(); Shell32.Folder destinationFolder = objShell.NameSpace(folderPath); Shell32.Folder sourceFile = objShell.NameSpace(zipFile); foreach (var file in sourceFile.Items()) { // Flags are: No progress displayed, Respond with 'Yes to All' for any dialog, no UI on error // I added 1024 too although not sure it's relevant with Zip files. // See https://msdn.microsoft.com/en-us/library/windows/desktop/bb787866%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 destinationFolder.CopyHere(file, 4 | 16 | 1024); } } 

然后你可以从脚本任务中的其他地方调用它,如下所示:

 string zipFilename = "C:\\temp\\awesome-zip-file.zip"; string targetDirectory = "C:\\temp\\my-output-folder"; UnZipFromMTAThread(zipFilename, targetDirectory);