C#: 将一个文本文件的*内容*追加到另一个文本文件

16

也许没有其他方法可以这样做,但是否有一种方法可以将一个文本文件的内容追加到另一个文本文件中,并在移动后清除第一个文件?

我知道的唯一方法是使用读取器和写入器,但对于大型文件来说似乎效率低下...

谢谢!


@Carn:那是一个犹豫的回答吗?还是... - CODe
1
你不能在操作系统级别将文件的块“unlink”并将它们“link”到另一个文件中(因为你想要的文件点可能不在块边界上)。你必须先读取、写入,然后清空。如果你想要以事务方式执行...好运! :)这不是SQL :)(在新版Windows上技术上是可能的)。如果你只想“正常”地做到这点,需要大约10/20行代码(也许更少)。 - xanatos
我想不出其他的方法了。除了用常量(最佳实践)替换“file1.txt”之外,我无法改进Jon的答案。 - Phil C
4个回答

28

不,我认为没有任何东西可以做到这一点。

如果这两个文件使用相同的编码,并且您不需要验证它们是否有效,您可以将它们视为二进制文件,例如:

using (Stream input = File.OpenRead("file1.txt"))
using (Stream output = new FileStream("file2.txt", FileMode.Append,
                                      FileAccess.Write, FileShare.None))
{
    input.CopyTo(output); // Using .NET 4
}
File.Delete("file1.txt");

注意,如果file1.txt包含字节顺序标记,您应该先跳过它,以避免它出现在file2.txt的中间。

如果您没有使用.NET 4,您可以编写自己的Stream.CopyTo等效方法...甚至可以使用扩展方法使交接无缝:

public static class StreamExtensions
{
    public static void CopyTo(this Stream input, Stream output)
    {
        if (input == null)
        {
            throw new ArgumentNullException("input");
        }
        if (output == null)
        {
            throw new ArgumentNullException("output");
        }
        byte[] buffer = new byte[8192];
        int bytesRead;
        while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            output.Write(buffer, 0, bytesRead);
        }
    }
}

+1 因为我从未想过在不添加另一个级别的 {} 的情况下将两者“级联”起来... 嗯... StyleCop 会标记它吗? - xanatos
@CODe:糟糕,我正在检查的时候电话响了。我会修复的。Stream.CopyTo仅适用于.NET 4 - 您使用的是哪个版本? - Jon Skeet
@Jon:哎,3.5分啊 :( 不过为了这个小项目我可以切换一下。 - CODe
@代码:没问题...我会添加一个辅助方法。 - Jon Skeet
@xanatos 我不确定StyleCop是否会标记它(尽管我认为不会),但我知道如果你让Visual Studio重新格式化你的代码,它不会尝试“修复”缩进。(特别是对于using语句,它会缩进嵌套的if语句) - Davy8
显示剩余6条评论

13

暂且不考虑错误处理、编码和效率,像这样做可能会起作用(但我还没有测试过)

File.AppendAllText("path/to/destination/file", File.ReadAllText("path/to/source/file"));

一旦完成这个步骤,您只需删除或清空第一个文件即可。


希望没有人把整个百科全书都放在一个文件里 :-) - xanatos
我喜欢这个一行代码。但我相信总有一天,我会后悔并重构它 :-) - JesusIsMyDriver.dll

3

这个的cmd.exe版本是:

type fileone.txt >>filetwo.txt

del fileone.txt

你可以创建一个系统 shell 来执行此操作,它应该非常有效。


如果您不想删除fileone.txt,而只是“清空它”,则可以使用type nul > fileone.txt - Randy Levy

0

我不确定你所说的“低效”是什么意思。Jon的回答对于大多数情况可能已经足够了。 然而,如果你担心源文件过于庞大,内存映射文件可能会帮到你。请参见this link以获取更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接