異邦人になってみた~~上海生活写真ブログ

中国上海市在住です。もう10年を超えました。休日は星空(天の川)撮影やポートレート撮影等、連休時はカメラを持って中国各地を旅行してます。最近は内モンゴル自治区によく行っています。

 このブログについて(about)
  中国旅行/観光/写真記事一覧(省別)

C#でtar.gzを作成し、Linuxで解凍するときにはまったこと

C#でtar.gzを作成するときに少しはまりました。

Windwosで解凍するとうまくいくんですが、
Linuxに送って解凍するとフォルダが作成されず。
XXXXFolderName\\XXXXfolderName\\FileNameとかになってしまいます。
これはWindowsLinuxのセパレータの違いでしょうか。
ソースはいろいろと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);
}
}