ZetCode

C# TAR

最后修改于 2023 年 7 月 5 日

C# TAR 教程展示了如何在 C# 语言中使用 TAR 归档文件

TAR 归档

tar(磁带归档)文件是文件的归档。 它是 Unix 系统上常见的檔案格式。 tar 将文件打包在一起,用于备份或分发。 TAR 文件不压缩。

.NET 包含使用 System.Formats.Tar 命名空间处理 TAR 文件的工具。

C# TarFile.CreateFromDirectory

TarFile.CreateFromDirectory 创建一个 tar 文件,其中包含指定目录中的所有文件。

$ ls data
words.txt  words2.txt

我们在 data 目录中有两个文本文件。

Program.cs
using System.Formats.Tar;

try {
    TarFile.CreateFromDirectory("data", "words.tar", false);

} catch (IOException e) {
    
    Console.WriteLine("failed to create archive");
    Console.WriteLine($"{e.Message}");
}

该程序从 data 目录中的文件创建一个新的 tar 归档。

TarFile.CreateFromDirectory("data", "words.tar", false);

第一个参数是我们要从中获取文件的目录。 第二个是归档名称。 最后一个参数确定我们是否将基本目录名称作为归档条目中所有名称的第一个路径段包含在内。

C# TarFile.ExtractToDirectory

TarFile.ExtractToDirectory 将 tar 文件的内容提取到指定的目录中。

Program.cs
using System.Formats.Tar;

try {
    TarFile.ExtractToDirectory("words.tar", "data", false);

} catch (IOException e) {
    
    Console.WriteLine("failed to extraxt archive");
    Console.WriteLine($"{e.Message}");
}

在该程序中,我们将 words.tar 文件提取到一个目录中。

C# TarReader

TarReader 从流中读取 tar 归档。

Program.cs
using System.Formats.Tar;

using FileStream fs = File.OpenRead("words.tar");
using var tr = new TarReader(fs);

TarEntry? entry;
while ((entry = tr.GetNextEntry(true)) != null)
{
    Console.WriteLine($"Name: {entry.Name}, Length: {entry.Length}");
}

在该程序中,我们显示提供的 tar 中的文件。

using FileStream fs = File.OpenRead("words.tar");
using var tr = new TarReader(fs);

我们使用 File.OpenRead 打开一个文件流,并创建 TarReader 的新实例。

TarEntry? entry;
while ((entry = tr.GetNextEntry(true)) != null)
{
    Console.WriteLine($"Name: {entry.Name}, Length: {entry.Length}");
}

我们使用 GetNextEntry 在 while 循环中遍历 tar 条目。 我们打印文件名及其大小。

$ dotnet run
Name: words.txt, Length: 17
Name: words2.txt, Length: 19

在下一个示例中,我们将读取归档文件的内容。

Program.cs
using System.Formats.Tar;
using System.Text;

using FileStream fs = File.OpenRead("words.tar");
using var tr = new TarReader(fs);

TarEntry? entry;
while ((entry = tr.GetNextEntry(true)) != null)
{
    using MemoryStream ms = new MemoryStream();

    if (entry.DataStream != null)
    {
        entry.DataStream.CopyTo(ms);

        string res = Encoding.UTF8.GetString(ms.ToArray());
        Console.WriteLine(res);
    }
}

该程序打开 tar 文件并读取文本文件的内容。

TarEntry? entry;
while ((entry = tr.GetNextEntry(true)) != null)
{
    using MemoryStream ms = new MemoryStream();
    ...
}

我们打开一个新的内存流。

if (entry.DataStream != null)
{
    entry.DataStream.CopyTo(ms);
    ...
}

我们将数据从 tar 条目数据流复制到内存流中。

string res = Encoding.UTF8.GetString(ms.ToArray());
Console.WriteLine(res);

来源

TarFile 类 - 语言参考

我们将内存流转换为字符串并将其打印到控制台。

在本文中,我们使用 C# 处理了 tar 文件。

作者

我叫 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 我从 2007 年开始撰写编程文章。 迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程