2011-02-23 61 views
12

可能没有其他方法可以做到这一点,但是有没有办法将一个文本文件的内容附加到另一个文本文件中,同时清除第一个文本文件后这个举动?C#:将一个文本文件的*内容*添加到另一个文本文件

我所知道的是只使用一个读者和作家,这似乎效率不高的大文件的唯一途径...

谢谢!

+0

这是唯一的方法? – CarneyCode 2011-02-23 19:46:27

+0

@Carn:这是一个犹豫的答案?或者... – CODe 2011-02-23 19:47:44

+1

您不能“解除链接”文件的块并将它们“链接”到SO级别的另一个文件(即使因为您想要的文件中的点不能位于块边界上)。你必须读,写,然后清除。如果你想做的事情......好吧......祝你好运! :-)这不是SQL :-)(从技术上讲,它可能适用于较新的Windows)。如果你只是想“通常”这样做,它大约是10/20行代码(可能更少) – xanatos 2011-02-23 19:49:36

回答

26

不,我不认为这有什么。

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

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

+1替换“file1.txt”外,我无法改进Jon的答案,因为我不会想到在没有添加其他级别的情况下“级联”两者。嗯...请问StyleCop标志了吗? – xanatos 2011-02-23 19:52:01

+0

@Jon:OpenAppend似乎不是File类的一个方法,你的意思是OpenWrite是偶然的吗?此外,CopyTo也不可用,您正在使用System.IO来处理这些...对吗?谢谢您的帮助! – CODe 2011-02-23 19:53:20

+0

@CODe:哎呀,正在检查电话铃响时。将解决。 'Stream.CopyTo'仅在.NET 4中使用 - 您使用的是哪个版本? – 2011-02-23 19:57:54

3

cmd.exe版本的,这是

型fileone.txt >> filetwo.txt

德尔fileone.txt

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

+0

如果你不想删除fileone.txt,但只是“清除它”,你可以使用'type nul> fileone.txt'。 – 2011-02-23 20:43:05

6

忽略的错误处理,编码和效率的时刻,这样的事情可能会工作(但我没有测试过)

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

然后你只需要删除或清除的第一个文件一旦这一步完成。

+0

并希望有人没有完整的百科全书文件:-) – xanatos 2011-02-23 19:54:50

0

我不确定您的意思是“低效率”。 Jon的答案对大多数情况来说可能就足够了。 但是,如果您担心非常大的源文件,Memory-Mapped Files可能是您的朋友。详情请见this link

相关问题