可能没有其他方法可以做到这一点,但是有没有办法将一个文本文件的内容附加到另一个文本文件中,同时清除第一个文本文件后这个举动?C#:将一个文本文件的*内容*添加到另一个文本文件
我所知道的是只使用一个读者和作家,这似乎效率不高的大文件的唯一途径...
谢谢!
可能没有其他方法可以做到这一点,但是有没有办法将一个文本文件的内容附加到另一个文本文件中,同时清除第一个文本文件后这个举动?C#:将一个文本文件的*内容*添加到另一个文本文件
我所知道的是只使用一个读者和作家,这似乎效率不高的大文件的唯一途径...
谢谢!
不,我不认为这有什么。
如果这两个文件使用相同的编码,并且您不需要验证它们是否有效,则可以将它们视为二进制文件,例如,
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替换“file1.txt”外,我无法改进Jon的答案,因为我不会想到在没有添加其他级别的情况下“级联”两者。嗯...请问StyleCop标志了吗? – xanatos 2011-02-23 19:52:01
@Jon:OpenAppend似乎不是File类的一个方法,你的意思是OpenWrite是偶然的吗?此外,CopyTo也不可用,您正在使用System.IO来处理这些...对吗?谢谢您的帮助! – CODe 2011-02-23 19:53:20
@CODe:哎呀,正在检查电话铃响时。将解决。 'Stream.CopyTo'仅在.NET 4中使用 - 您使用的是哪个版本? – 2011-02-23 19:57:54
的cmd.exe
版本的,这是
型fileone.txt >> filetwo.txt
德尔fileone.txt
您可以创建一个系统shell来执行此操作。它应该非常有效。
如果你不想删除fileone.txt,但只是“清除它”,你可以使用'type nul> fileone.txt'。 – 2011-02-23 20:43:05
忽略的错误处理,编码和效率的时刻,这样的事情可能会工作(但我没有测试过)
File.AppendAllText("path/to/destination/file", File.ReadAllText("path/to/source/file"));
然后你只需要删除或清除的第一个文件一旦这一步完成。
并希望有人没有完整的百科全书文件:-) – xanatos 2011-02-23 19:54:50
我不确定您的意思是“低效率”。 Jon的答案对大多数情况来说可能就足够了。 但是,如果您担心非常大的源文件,Memory-Mapped Files
可能是您的朋友。详情请见this link。
这是唯一的方法? – CarneyCode 2011-02-23 19:46:27
@Carn:这是一个犹豫的答案?或者... – CODe 2011-02-23 19:47:44
您不能“解除链接”文件的块并将它们“链接”到SO级别的另一个文件(即使因为您想要的文件中的点不能位于块边界上)。你必须读,写,然后清除。如果你想做的事情......好吧......祝你好运! :-)这不是SQL :-)(从技术上讲,它可能适用于较新的Windows)。如果你只是想“通常”这样做,它大约是10/20行代码(可能更少) – xanatos 2011-02-23 19:49:36