【发布时间】:2012-04-12 01:19:46
【问题描述】:
我想创建一个 .txt 文件并写入它,如果该文件已经存在,我只想追加一些行:
string path = @"E:\AppServ\Example.txt";
if (!File.Exists(path))
{
File.Create(path);
TextWriter tw = new StreamWriter(path);
tw.WriteLine("The very first line!");
tw.Close();
}
else if (File.Exists(path))
{
TextWriter tw = new StreamWriter(path);
tw.WriteLine("The next line!");
tw.Close();
}
但是第一行似乎总是被覆盖......我怎样才能避免在同一行上写(我在循环中使用它)?
我知道这是一件非常简单的事情,但我以前从未使用过WriteLine 方法。我对 C# 完全陌生。
【问题讨论】:
-
请注意,这里几乎所有的答案都是错误的,并且受制于竞争条件。请记住:模式
if (file exists) { open file }在所有编程语言中几乎总是错误的!对于 .NET,解决方案是使用带有适当标志的File.Open(path, FileMode.Append, FileAccess.ReadWrite)。 -
“一个 FileMode 值,它指定一个文件不存在时是否创建,并确定现有文件的内容是保留还是覆盖。”所以同样的事情是由 .net 完成的,而不是这里的手动方法。所以这里没有错,它是手动完成的相同过程。你可以说效率低下,但说错了不算数。
-
不同之处在于:
File.Open在内部委托给一个 WinAPI 函数(见下一条评论),希望能防止竞争条件。这里的大多数解决方案都不会这样做,并且很明显会受到竞争条件的影响。 -
存在性检查是由 FileMode.Append 确定的。它指向存在性检查,然后使用 CreateFileA 创建文件。仍然说错有点极端,但你可以说效率低下。我们也不应该忘记存在检查可能不仅仅用于写/读访问,也可能用于其他事务,所以对于新手来说,这个主题有助于理解它是如何工作的。但是,如果您可以添加一个答案,包括您在此处编写的所有定义以及为什么它更好的原因,这将作为一个答案有很大帮助,并且可能会被选为正确的。
-
@ComFreek 我强烈同意你应该写一个完整的答案来清楚地解释它。评论不是用来回答的,我对这些竞态条件以及您提出的解决方案非常好奇。
标签: c# text-files