2016-05-13 1 views
0

Я пытаюсь разархивировать файл, используя скрипт C# в ssis. Первоначально я использовал IonicZip.dll, чтобы сделать это, как показано ниже, и он работал нормально.Удаление файла с использованием автономного exe - C#

private string ExtractFileToDirectory(string strSourceDirectory, string strDestinationDirectory, string strFileName) 
{ 
    string extractFileName = String.Empty; 
    try 
    { 

     ZipFile zip = ZipFile.Read(Path.Combine(strSourceDirectory ,strFileName)); 
     Directory.CreateDirectory(strDestinationDirectory); 
     foreach (ZipEntry e in zip) 
     { 
      e.Extract(strDestinationDirectory, ExtractExistingFileAction.OverwriteSilently); 
      extractFileName = e.FileName; 
     } 
     zip.Dispose(); 
     return extractFileName; 

    } 
    catch 
    { 
     // 
    } 
} 

Однако у меня нет разрешения на развертывание dll на сервере. Поэтому я переключился на 7Z.exe (автономный exe). На полпути я понял, что поддерживает только 7z, cab, zip, gzip, bzip2, Z и форматы tar. Файл, который мне нужен для zip, не имеет расширения.

Есть ли способ извлечь файлы с автономным exe? Я использую C# 4.0 в ssis.

Мой 7zip код

string str7ZipPath = @"C:\Tools Use\7zip"; 
string str7ZipArgs = "a -tzip "+ @"""C:\Source\FileA"""+ @" ""C:\Zip\*.*"""; 

ProcessStartInfo psi = new ProcessStartInfo(); 
psi.CreateNoWindow = false; 
psi.UseShellExecute = false; 
psi.FileName = str7ZipPath + "\\7za.exe"; 
psi.WindowStyle = ProcessWindowStyle.Normal; 
psi.Arguments = str7ZipArgs; 


try 
{ 
    using (Process proc = Process.Start(psi)) 
    { 
     proc.WaitForExit(); 
    } 
} 
catch (Exception ex) 
{ 

} 
+0

Проверьте это: https://blogs.msdn.microsoft.com/microsoft_press/2010/02/03/jeffrey-richter-excerpt-2-from-clr -via-c-third-edition/ – Sidewinder94

+1

и что относительно уже доступных ресурсов .net на FW? https://msdn.microsoft.com/en-us/library/system.io.compression.zipfile%28v=vs.110%29.aspx – Gusman

+0

У меня плохая память с обработкой zip-файлов с использованием NET Framework (System.IO.Packaging) и полностью забыл, что добавили новое пространство имен для этих целей :) – Sidewinder94

ответ

1

Чтобы сжать/распаковки файлов, вы можете, так как .NET Framework 4.5 с помощью System.Io.Compression.ZipFile класса.

Однако, если вы не можете использовать версию этого .NET Framework, вы должны будете вставлять DLL в сборку:

Вы можете добавить DLL к проекту и установите действие сборки для Embedded Resource

Затем вам нужно будет подписаться на событие вашего приложения AssemblyResolve, чтобы вручную загрузить DLL из встроенных ресурсов вашего приложения.

Пример:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => 
    { 
      String resourceName = “<YourAssemblyName>.” + 
       new AssemblyName(args.Name).Name + “.dll”; 
      using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) 
      { 
       Byte[] assemblyData = new Byte[stream.Length]; 
       stream.Read(assemblyData, 0, assemblyData.Length); 
       return Assembly.Load(assemblyData); 
      } 
    }; 

Вы можете более подробное объяснение Джеффри Рихтер здесь (я leanred этот трюк оттуда): https://blogs.msdn.microsoft.com/microsoft_press/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition/

ИЛИ

Вы можете попробовать использовать ILMerge , У этого есть некоторые ограничения, которые предотвращают его une в некоторых проектах, но

+0

Спасибо Sidewinder94. Я попробую это. –

+0

Могу ли я использовать System.Reflection для загрузки dll .. Будет ли это работать? –

+0

'System.Reflection' должно быть хорошо, чтобы получить текущее имя сборки да. (Обратите внимание, что я не пробовал, хотя) – Sidewinder94