首页 新闻 会员 周边

用c# 如何把一个文件夹下的多个文件打包为tar格式的压缩包

1
悬赏园豆:100 [已解决问题] 解决于 2018-07-09 21:19

用c# 实现如何把一个文件夹下的多个文件(当文件名为中文时,在压缩包里不能出现乱码问题)打包为tar格式的压缩包,最好是一个文件一个文件放到tar压缩包里

例如:  

c#
Victor_huang的主页 Victor_huang | 初学一级 | 园豆:54
提问于:2018-07-07 21:36
< >
分享
最佳答案
1

public static void TarCreateFromStream()
{

// 创建输出流。不必是磁盘,可以是内存流等。
string tarOutFn = @"d:\test.tar";
Stream outStream = File.Create(tarOutFn);
TarOutputStream tarOutputStream = new TarOutputStream(outStream);

CreateTarArchive(tarOutputStream, @"D:\文件夹");

// 关闭归档文件也关闭底层流。
tarOutputStream.Close();
}

private static void CreateTarArchive(TarOutputStream tarOutputStream, string sourceDirectory)
{
// 可选地,为目录本身写一个条目。
// TarEntry tarEntry = TarEntry.CreateEntryFromFile(sourceDirectory);
// tarOutputStream.PutNextEntry(tarEntry);
// 将每个文件写入tar。
string[] filenames = Directory.GetFiles(sourceDirectory);

foreach (string filename in filenames)
{
using (Stream inputStream = File.OpenRead(filename))
{
int idxStart = filename.LastIndexOf('\\') + 1;
string tarName = filename.Substring(idxStart, filename.Length - idxStart);
long fileSize = inputStream.Length;
TarEntry entry = TarEntry.CreateTarEntry(tarName);

// 必须设置大小,否则当输出超过时,TAROutPutsFipe将失败。
entry.Size = fileSize;

// 在写入数据之前,将条目添加到TAR流中。
tarOutputStream.PutNextEntry(entry);

// 这是从TracSovi.Read EngyCype复制的
byte[] localBuffer = new byte[32 * 1024];
while (true)
{
int numRead = inputStream.Read(localBuffer, 0, localBuffer.Length);
if (numRead <= 0)
{
break;
}
tarOutputStream.Write(localBuffer, 0, numRead);
}
}
tarOutputStream.CloseEntry();
}
// 递归。如果不需要就删除。
//string[] directories = Directory.GetDirectories(sourceDirectory);
//foreach (string directory in directories)
//{
// CreateTarArchive(tarOutputStream, directory);
//}
}

Victor_huang | 初学一级 |园豆:54 | 2018-07-09 20:20
其他回答(3)
0

找个c#的 压缩支持库 ,调用之。

或者

通过c#调用外部shell命令,实现之。

再或者

你自己从头编码实现吧! 哈哈

jinzhenshui | 园豆:383 (菜鸟二级) | 2018-07-09 09:31
0

网上那么多,那为什么不去搜呢!

https://www.codeproject.com/Questions/679480/To-compress-a-folder-with-tar

https://github.com/icsharpcode/SharpZipLib/wiki/GZip-and-Tar-Samples

收获园豆:20
放逐人 | 园豆:694 (小虾三级) | 2018-07-09 16:49
1

public static void TarCreateFromStream()
{

// 创建输出流。不必是磁盘,可以是内存流等。
string tarOutFn = @"d:\test.tar";
Stream outStream = File.Create(tarOutFn);
TarOutputStream tarOutputStream = new TarOutputStream(outStream);

CreateTarArchive(tarOutputStream, @"D:\文件夹");

// 关闭归档文件也关闭底层流。
tarOutputStream.Close();
}

private static void CreateTarArchive(TarOutputStream tarOutputStream, string sourceDirectory)
{
// 可选地,为目录本身写一个条目。
// TarEntry tarEntry = TarEntry.CreateEntryFromFile(sourceDirectory);
// tarOutputStream.PutNextEntry(tarEntry);
// 将每个文件写入tar。
string[] filenames = Directory.GetFiles(sourceDirectory);

foreach (string filename in filenames)
{
using (Stream inputStream = File.OpenRead(filename))
{
int idxStart = filename.LastIndexOf('\\') + 1;
string tarName = filename.Substring(idxStart, filename.Length - idxStart);
long fileSize = inputStream.Length;
TarEntry entry = TarEntry.CreateTarEntry(tarName);

// 必须设置大小,否则当输出超过时,TAROutPutsFipe将失败。
entry.Size = fileSize;

// 在写入数据之前,将条目添加到TAR流中。
tarOutputStream.PutNextEntry(entry);

// 这是从TracSovi.Read EngyCype复制的
byte[] localBuffer = new byte[32 * 1024];
while (true)
{
int numRead = inputStream.Read(localBuffer, 0, localBuffer.Length);
if (numRead <= 0)
{
break;
}
tarOutputStream.Write(localBuffer, 0, numRead);
}
}
tarOutputStream.CloseEntry();
}
// 递归。如果不需要就删除。
//string[] directories = Directory.GetDirectories(sourceDirectory);
//foreach (string directory in directories)
//{
// CreateTarArchive(tarOutputStream, directory);
//}
}

收获园豆:80
Warrior丶Seven | 园豆:282 (菜鸟二级) | 2018-07-09 21:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册