Как извлечь tar.gz, включая многобайтовые символы и запрещенные символы на окнах

0

Я попытался извлечь 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();
} 

}

Кто-нибудь может мне помочь? Благодарю.

  • 2
    Кто-нибудь может объяснить, почему это должно быть не по теме? ОП уже пробовал разные фреймворки / библиотеки, но безуспешно. Таким образом, мы можем ответить с помощью еще одной библиотеки или конфигураций для уже опробованных, решающих проблему. Это похоже на тему для меня.
  • 2
    Есть так много вещей, которые не работают с окнами, такими как символические ссылки или многие подпапки. Вам не нужно использовать сервер Linux, только любая система Linux
Показать ещё 5 комментариев
Теги:
tar

1 ответ

2

попытался извлечь tar.gz следующие библиотеки, но все они не работают отлично. Окружающая среда, в которой создается tar.gz, является linux, а среда, в которой извлекается это окно. И я не могу дотронуться до сервера linux, потому что сервер - это другая компания.

Привет, вы пробовали http://www.7-zip.org/?

  • 0
    Спасибо за быстрый ответ! Я пробовал 7-zip, но многобайтовые символы превращаются в мусор.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню