2016-05-13 17 views
0

ssisのC#スクリプトを使用してファイルを解凍しようとしています。 私は最初に以下のように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を展開する権限はありません。そこで私は7Za.exe(スタンドアロンのexe)に切り替えました。途中で私は7z、cab、zip、gzip、bzip2、Zとtar形式しかサポートしていないことに気づいた。 zipに必要なファイルには拡張子がありません。

スタンドアロンのexeでファイルを抽出する方法はありますか?私はssisでC#4.0を使用しています。

私の7zipをコードは、.NET Framework 4.5がSystem.Io.Compression.ZipFileクラスを使用しているため、次のことができ、/解凍ファイルを圧縮するには

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

とFW上ですでに利用可能な.netリソースはどうですか? https://msdn.microsoft.com/en-us/library/system.io.compression.zipfile%28v=vs.110%29.aspx – Gusman

+0

.NET Frameworkを使用してzipファイルを処理すると、メモリが不足しています( System.IO.Packaging)、これらの目的のために新しい名前空間を追加したことを完全に忘れていました:) – Sidewinder94

答えて

1

です。

あなたはこの.NET Frameworkののバージョンを使用することができない場合は、あなたがあなたのアセンブリにDLLを埋め込む必要があります:

あなたがプロジェクトにDLLを追加し、Embedded Resource

にビルドアクションを設定することができます

アプリケーションの埋め込みリソースから手動でdllを読み込むには、アプリケーションのAssemblyResolveイベントを登録する必要があります。

例:あなたがここにジェフリー・リヒターによって、より詳細な説明(私はそこからこのトリックをleanred)することができます

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); 
      } 
    }; 

https://blogs.msdn.microsoft.com/microsoft_press/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition/

OR

あなたはILMergeを使用しようとすることができ

。 いくつかの制限がありますが、いくつかのプロジェクトでそれが起こるのを防ぐには

+0

から利用可能です。Sidewinder94に感謝します。私はこれを試してみます。 –

+0

System.Reflectionを使用してDLLを読み込むことはできますか? –

+0

現在のアセンブリ名を取得するには 'System.Reflection'が良いはずです。 (私はそれを試していないことに注意してください) – Sidewinder94

関連する問題