Я попытался извлечь tar.gz, используя следующие библиотеки, но ни один из них не работает отлично.
Окружение, в котором я создаю tar.gz, - это linux, а среда, в которой я извлекаю, - это окна.
И я не могу дотронуться до сервера linux, потому что сервер - это другая компания.
M: многобайтовые символы
W: Запрещенные символы Windows (:;/\ (¥) |, *? "<>)
SharpZiplib (С#)
M: NG
W: Может заменить запрещенные символы другим символам
Stream st = new GZipInputStream(File.OpenRead(attFile));
TarArchive archive = TarArchive.CreateInputTarArchive(st, TarBuffer.DefaultBlockFactor);
archive.SetKeepOldFiles(false);
archive.AsciiTranslate = false;
archive.SetUserInfo(0, "", 0, "None");
Directory.CreateDirectory(Work);
archive.ExtractContents(Work);
archive.Close();
tar32.dll (С#)
M: ОК
W: данные не генерируются
public static void ExtractTarWithDLL(string Targzpath)
{
IntPtr i = new IntPtr();
string szCmdLine = "-x " + Targzpath + " -o " + Path.GetDirectoryName(Targzpath);
Console.WriteLine(Path.GetDirectoryName(Targzpath));
StringBuilder error = new StringBuilder(512);
Tar(i, szCmdLine, error, 512);
}
tar-cs (С#)
M: NG
W: Может заменить запрещенные символы другим символам
/// <summary>
/// Example of tar-cs library usage to extract tar.gz-archives.
/// Please use the latest version (from trunk) of the library.
/// </summary>
public static class TarGZip
{
public static void Extract(string inputFile, string outputDirectory)
{
using (FileStream inputStream = File.OpenRead(inputFile))
using (Stream tarStream = UnGZipSteam(inputStream))
{
var tarReader = new TarReader(tarStream);
while (tarReader.MoveNext(false)) // Moves pointer to the next file in the tar archive.
{
ExtractTarEntry(tarReader, outputDirectory);
}
}
}
/// <summary>
/// Since GZipStream.Position Property is not implemented,
/// it is necessary to use MemoryStream as intermediate storage.
/// </summary>
/// <param name="inputStream">The input stream.</param>
/// <returns>Un-gzipped stream.</returns>
private static Stream UnGZipSteam(Stream inputStream)
{
using (GZipStream gZipStream = new GZipStream(inputStream, CompressionMode.Decompress))
{
MemoryStream memoryStream = new MemoryStream();
gZipStream.CopyTo(memoryStream);
memoryStream.Position = 0;
return memoryStream;
}
}
private static void ExtractTarEntry(TarReader tarReader, string outputDirectory)
{
string relativePath = tarReader.FileInfo.FileName;
// Relative path can contain slash, not backslash.
// Use Path.GetFullPath() method to convert path.
//relativePath = relativePath.Replace('?','');
string fullPath = Path.GetFullPath(Path.Combine(outputDirectory, relativePath));
//string fullPath = Path.GetFullPath(Path.Combine(outputDirectory, "windows.txt"));
switch (tarReader.FileInfo.EntryType)
{
case EntryType.File:
case EntryType.FileObsolete:
using (FileStream outputStream = File.Create(fullPath))
{
// Read data from a current file to a Stream.
tarReader.Read(outputStream);
}
break;
case EntryType.Directory:
Directory.CreateDirectory(fullPath);
break;
default:
throw new NotSupportedException("Not supported entry type: " + tarReader.FileInfo.EntryType);
}
}
}
tarlib (C++)
M: данные не генерируются
W: данные не генерируются
Я использую этот пример кода. http://www.codeproject.com/Articles/470999/tarlib-Windows-TAR-Library
ant.jar(java)
M: По умолчанию многобайтовые символы заменяются на '_'
W: throws java.io.FileNotFoundException
public class Targz {
public void extract(Path path) throws IOException {
if(!path.toString().endsWith(".tar.gz")){
throw new Error("extension must be tar.gz.");
}
TarInputStream tin = new TarInputStream(new GZIPInputStream(new FileInputStream(path.toFile())));
for(TarEntry tarEnt = tin.getNextEntry(); tarEnt != null; tarEnt = tin.getNextEntry()) {
if(tarEnt.isDirectory()){
new File(tarEnt.getName()).mkdir();
}
else {
FileOutputStream fos = new FileOutputStream(new File(tarEnt.getName()));
tin.copyEntryContents(fos);
}
}
tin.close();
}
}
Кто-нибудь может мне помочь? Благодарю.
попытался извлечь tar.gz следующие библиотеки, но все они не работают отлично. Окружающая среда, в которой создается tar.gz, является linux, а среда, в которой извлекается это окно. И я не могу дотронуться до сервера linux, потому что сервер - это другая компания.
Привет, вы пробовали http://www.7-zip.org/?