C#でtar.gzを作成するときに少しはまりました。
Windwosで解凍するとうまくいくんですが、
Linuxに送って解凍するとフォルダが作成されず。
XXXXFolderName\\XXXXfolderName\\FileNameとかになってしまいます。
これはWindowsとLinuxのセパレータの違いでしょうか。
ソースはいろいろとWeb上に落ちていますが、注意点があります。
Windows側のパスは全て\\で統一します。
※CreateTarGz(string outputTarFilePath, string sourceDirectory)
パラメータのパスは\\つながるように作成。
関数の中で\\を/に変換「Replace('\\', '/');」する処理を入れます。
これだけです。
//using ICSharpCode.SharpZipLib.GZip;
//using ICSharpCode.SharpZipLib.Tar;
//TarGzArchiveClass
public void CreateTarGz(string outputTarFilePath, string sourceDirectory)
{using (FileStream fs = new FileStream(outputTarFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
using (Stream gzipStream = new GZipOutputStream(fs))
using (TarArchive tarArchive = TarArchive.CreateOutputTarArchive(gzipStream, TarBuffer.DefaultBlockFactor))
{
tarArchive.SetKeepOldFiles(false);
tarArchive.SetUserInfo(0, "", 0, "None");AddDirectoryFilesToTar(tarArchive, sourceDirectory, sourceDirectory, true);
}
}private void AddDirectoryFilesToTar(TarArchive tarArchive, string rootDirectory, string sourceDirectory, bool recurse)
{
if (recurse)
{
string[] directories = Directory.GetDirectories(sourceDirectory);
foreach (string directory in directories)
AddDirectoryFilesToTar(tarArchive, rootDirectory, directory, recurse);
}string[] filenames = Directory.GetFiles(sourceDirectory);
foreach (string filename in filenames)
{
TarEntry tarEntry = TarEntry.CreateEntryFromFile(filename);tarEntry.Name = filename.Remove(0, rootDirectory.Length + 1).Replace('\\', '/');
tarArchive.WriteEntry(tarEntry, true);
}
}