Как разархивировать папку с несколькими файлами с помощью задачи сценария SSIS С# 2005 или 2008?

В моем проекте есть требование, чтобы мне нужно было распаковать какую-нибудь zip-папку. Я погуглил и узнал, что без использования внешних библиотек я не могу этого добиться, или с классом GzipStream мы можем распаковать .gz файлов.

Есть ли способ распаковать без использования каких-либо внешних библиотек?

PS: для этого мне нужно использовать только компонент задачи сценария, а .Net framework 3.0.

Заранее спасибо.


person Ishan Trikha    schedule 03.01.2014    source источник
comment


Ответы (2)


A) Объявите переменную FileName как строковый тип данных

B) Используйте цикл ForEach, чтобы просмотреть файлы в папке и сопоставить имена файлов с переменной FileName.

C) Используйте задачу «Выполнение процесса» для архивации/распаковки в отдельные файлы.

Г) Выполнить пакет

Краткое пошаговое руководство см. на странице http://sqlserversolutions.blogspot.com/2008/10/zip-and-unzip-files-in-folder.html

Вы также можете взглянуть на этот http://gallery.technet.microsoft.com/Unzipping-with-SSIS-Script-6b055183

person StackTrace    schedule 03.01.2014

Я не хотел использовать подход 7zip или внешнюю библиотеку, потому что это немного усложняет развертывание пакета SSIS. Поэтому я применил аналогичный подход к скрипту галереи на который ссылается @StackTrace, а также задокументировано здесь и здесь. У меня уже была задача сценария, выполняющая другую логику, поэтому для этого мне просто нужен был код C#. Я обнаружил, что задача сценария выполнялась в потоке MTA, но код Shell32 должен выполняться в потоке STA, поэтому я остановился на этом коде. Надеюсь, поможет кому-то еще:

/// <summary>
/// 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.
/// </summary>
/// <param name="zipFile">File to unzip</param>
/// <param name="folderPath">Folder to put the unzipped files</param>
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();
    }
}

/// <summary>
/// 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().
/// </summary>
/// <param name="param">object array containing: [string zipFile, string destinationFolderPath]</param>
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);
person Rory    schedule 21.02.2017