在 Windows 中创建 tar 存档会重新引入 CR 字符

本文关键字:新引入 CR 字符 Windows 创建 tar | 更新日期: 2023-09-27 18:33:22

我通过将文件中的行尾从 DOS 转换为 C# 中的 UNIX 格式来删除文件中的回车符。这基本上意味着我正在删除文件格式的回车符。

我使用的代码:

private void Dos2Unix(string fileName)
{
    const byte CR = 0x0D;
    const byte LF = 0x0A;
    byte[] data = File.ReadAllBytes(fileName);
    using (FileStream fileStream = File.OpenWrite(fileName))
    {
        BinaryWriter bw = new BinaryWriter(fileStream);
        int position = 0;
        int index = 0;
        do
        {
            index = Array.IndexOf<byte>(data, CR, position);
            if ((index >= 0) && (data[index + 1] == LF))
            {
                // Write before the CR
                bw.Write(data, position, index - position);
                // from LF
                position = index + 1;
            }
        }
        while (index > 0);
        bw.Write(data, position, data.Length - position);
        fileStream.SetLength(fileStream.Position);
    }
}

但是在我从DOS转换为Unix格式后,我需要为所有转换后的文件创建一个tar存档。当我使用以下代码创建文件的 tar 存档时:

batchFileContents[1] = String.Format("'"C:''Program Files (x86)''7-Zip''7z.exe'" a -ttar -so archive.tar '"{0}'"* | " +
                        "'"C:''Program Files (x86)''7-Zip''7z.exe'" a -si '"{1}'"", inputDirectory, nameOfFile);
File.WriteAllLines("execute.bat", batchFileContents);

回车符将重新出现在所有文件中。

上面的dos2UNIX函数能够删除回车符。 但问题是,当 tar 创建存档时,回车符再次出现。 如何避免这种情况?

如何解决此问题?需要一些指导。

在 Windows 中创建 tar 存档会重新引入 CR 字符

为什么要使用 7zip 创建 tar 存档?最终,您无法控制第三方程序的行为。

你可以尝试 https://code.google.com/archive/p/tar-cs/这是一个直接从 C# 创建 tar 存档的库,它是开源的。如果它最终添加了回车符,您可以尝试其他库或自己查看源代码以了解原因。

首先,避免重新发明(方形)轮子:

    Cygwin
  • 中已经有一个d2u实用程序(如果你不想打扰Cygwin,你可以获取它的源代码并重新编译或Windows端口)。不过,您选择在 .NET 中执行此操作的方式似乎最适合中型文件。
  • 您可以直接执行命令行,而无需临时文件(在缺少system()库函数的 .NET 中,典型的拐杖是在它们前面加上 cmd /c )。

现在,根据定义,tar格式只是用最少的元数据粘合在一起的文件。不涉及数据转换。因此,您的问题出在其他地方 - 也许您正在存档错误的文件或检查存档数据的不忠实表示。