-->

How to zip a Folder using SSIS 2008 without using

2019-09-21 14:05发布

问题:

I have a scenario where i would like to compress my folder due to presence of large number of files present in them using SSIS 2008. Consider it like i have one Source Folder and one Target Folder and while moving files from "SRC" to "TGT" the folder must be compressed in destination.Now feasible option for doing this i think is SSIS Script task ,since I cannot use Execute Process task due to restriction of using any third party software like 7z/Winrar etc.But i am not able to implement this even after using SSIS Script Component.Tried many online solutions but it did not work.How can i implement such thing using SSIS 2008?

回答1:

You can use the ZipPackage class if you are targeting .Net 3 and above. Complete example here:

https://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx

There is also a ZipArchive class, example here:

https://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive(v=vs.110).aspx



回答2:

I did this exercise , I created a Script Task to perform compression of a folder by using the compression provided by Windows; the folder name can dynamically change. In this way it is not necessary to use third party software like 7z/Winrar etc..

You need to provide to the Script Task the folder to be zipped and the name of the compressed folder as ReadOnlyVariables (to be added in the tab ReadOnlyVariables)

These two variables must be defined in the Variables tab (String type) of the package and can be changed dynamically through a cycle (eg. for each)

I use these two variables:

sFolderCompressed - the folder '.zip' that you want to obtain eg. \\XX.XX.XX.XX\C$\.....\folderCompressed
sFolderSource - the source folder containing the files affected eg. \\XX.XX.XX.XX\C$\.....\folderSource

(*)

The script is made using c#, choose Script Language: Microsoft Visual C# 2008

This is the code to be added in the Main method:

public void Main()
{
    // TODO: Add your code here

    try
    {
        // variables used in process
        string l_sFolderCompressed = (string)Dts.Variables["User::sFolderCompressed"].Value;
        string l_sFolderSource = (string)Dts.Variables["User::sFolderSource"].Value;
        string l_sCommand = "zip -j " + l_sFolderCompressed + " " + l_sFolderSource + "/*";
        // create the ProcessStartInfo using "cmd" as the program to be run,
        // and "/C " as the parameters.
        // Incidentally, /C tells cmd that we want it to execute the command that follows,
        // and then exit.
        System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", "/C " + l_sCommand);     
        // The following commands are needed to redirect the standard output.
        // This means that it will be redirected to the Process.StandardOutput StreamReader.
        procStartInfo.RedirectStandardOutput = true;
        procStartInfo.UseShellExecute = false;
        // Do not create the black window.
        procStartInfo.CreateNoWindow = true;
        // Now we create a process, assign its ProcessStartInfo and start it
        System.Diagnostics.Process proc = new System.Diagnostics.Process();
        proc.StartInfo = procStartInfo;
        proc.Start();
        // Get the output into a string
        string result = proc.StandardOutput.ReadToEnd();
        // Possibly display the command output.
    }
    catch (Exception objException)
    {
        Dts.TaskResult = (int)ScriptResults.Failure;
        // Log the exception
    }
    Dts.TaskResult = (int)ScriptResults.Success;
}

You can also manage a single file

"cmd", "/C zip -j c:\\...\file.zip c:\\..\file.txt");

I hope can help