私はこれを行うための最良の方法を見つけようとしてきました。.jarの内容を抽出し、ファイルをディレクトリに移動して、それをjarとして戻すことを考えました。最善の解決策や、それをどのように行うかはわかりません。DotNetZipとSharpZipLibを見ましたが、どちらを使用すればよいかわかりません。
誰かが私にこれを行う方法に関するコードへのリンクを与えることができればそれはありがたいです。
私はこれを行うための最良の方法を見つけようとしてきました。.jarの内容を抽出し、ファイルをディレクトリに移動して、それをjarとして戻すことを考えました。最善の解決策や、それをどのように行うかはわかりません。DotNetZipとSharpZipLibを見ましたが、どちらを使用すればよいかわかりません。
誰かが私にこれを行う方法に関するコードへのリンクを与えることができればそれはありがたいです。
Minecraft 1.3.1 で作業していると思いますか? もしそうなら、aux.class と呼ばれる zip に含まれるファイルがあります。残念ながら、これは Windows で予約されたファイル名です。私は自分でjarファイルを操作しながら改造のプロセスを自動化しようとしてきましたが、ほとんど成功していません. 私がまだ調査していない唯一のオプションは、その例外を監視しながら、jar ファイルの内容を一時的な場所に抽出する方法を見つけることです。問題が発生した場合は、ファイルの名前を一時的な名前に変更し、抽出して次に進みます。次に、zip ファイルを再作成するときに、ファイルにアーカイブ内の元の名前を付けます。私自身の経験から、SharZipLib は必要なことを適切に実行しないか、少なくともその方法を理解できませんでした。代わりに Ionic Zip (Dot Net Zip) を使用し、問題のあるファイルの名前変更ルートを試すことをお勧めします。加えて、これについても質問を投稿しました。あなたは私がどこまで到達したかを見ることができますzip エントリを別の zip ファイルに抽出する
編集 - .net zip をさらにテストしました ( http://dotnetzip.codeplex.com/から入手可能)。必要なものは次のとおりです。予約済みのファイル名を含む任意の zip ファイルで動作すると思います。私はそれがC#であることを知っていますが、あなたのためにすべての作業を行うことはできません:P
public static void CopyToZip(string inArchive, string outArchive, string tempPath)
{
ZipFile inZip = null;
ZipFile outZip = null;
try
{
inZip = new ZipFile(inArchive);
outZip = new ZipFile(outArchive);
List<string> tempNames = new List<string>();
List<string> originalNames = new List<string>();
int I = 0;
foreach (ZipEntry entry in inZip)
{
if (!entry.IsDirectory)
{
string tempName = Path.Combine(tempPath, "tmp.tmp");
string oldName = entry.FileName;
byte[] buffer = new byte[4026];
Stream inStream = null;
FileStream stream = null;
try
{
inStream = entry.OpenReader();
stream = new FileStream(tempName, FileMode.Create, FileAccess.ReadWrite);
int size = 0;
while ((size = inStream.Read(buffer, 0, buffer.Length)) > 0)
{
stream.Write(buffer, 0, size);
}
inStream.Close();
stream.Flush();
stream.Close();
inStream = new FileStream(tempName, FileMode.Open, FileAccess.Read);
outZip.AddEntry(oldName, inStream);
outZip.Save();
}
catch (Exception exe)
{
throw exe;
}
finally
{
try { inStream.Close(); }
catch (Exception ignore) { }
try { stream.Close(); }
catch (Exception ignore) { }
}
}
}
}
catch (Exception e)
{
throw e;
}
}
DotNetZipについては、zip アーカイブの作成とディレクトリへの zip アーカイブの抽出の両方の非常に単純な VB.NET の例をここで見つけることができます。拡張子.jarを付けて圧縮ファイルを保存することを忘れないでください。
SharpZipLibの場合、アーカイブの作成と抽出のより包括的な例がここにあります。
これらのライブラリのいずれも完全な JAR アーカイブを抽出できない場合は、7-zipなどのより本格的な圧縮ソフトウェアにアクセスすることも検討できますProcess.Start
。7za.dll
。_ COM の使用方法の詳細については、こちらを参照してください。