異邦人になってみた~上海の人 

読者です 読者をやめる 読者になる 読者になる

異邦人になってみた~上海の人 

上海在住です。中国時代劇をよく見ています、中国旅行の事、weiboやQQの設定、一眼レフカメラの写真掲載、上海での日々の生活情報を書いています

 記事一覧表示
スポンサーリンク

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

プログラム C#

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);
}
}