如果您不必考虑写入同一文件的其他进程并且您的进程对目录具有创建权限,则处理此问题的最有效方法是:
- 使用临时名称创建新文件
- 写新文本
- 附加文件中的旧文本
- 删除文件
- 重命名临时文件
它不会那么酷和快速,但至少你不必为你现在使用的方法在内存中分配一个巨大的字符串。
但是,如果您确定文件会很小,例如少于几兆字节,那么您的方法还不错。
但是你可以稍微简化你的代码:
public static void InsertText( string path, string newText )
{
if (File.Exists(path))
{
string oldText = File.ReadAllText(path);
using (var sw = new StreamWriter(path, false))
{
sw.WriteLine(newText);
sw.WriteLine(oldText);
}
}
else File.WriteAllText(path,newText);
}
对于大文件(即 > 几 MB)
public static void InsertLarge( string path, string newText )
{
if(!File.Exists(path))
{
File.WriteAllText(path,newText);
return;
}
var pathDir = Path.GetDirectoryName(path);
var tempPath = Path.Combine(pathDir, Guid.NewGuid().ToString("N"));
using (var stream = new FileStream(tempPath, FileMode.Create,
FileAccess.Write, FileShare.None, 4 * 1024 * 1024))
{
using (var sw = new StreamWriter(stream))
{
sw.WriteLine(newText);
sw.Flush();
using (var old = File.OpenRead(path)) old.CopyTo(sw.BaseStream);
}
}
File.Delete(path);
File.Move(tempPath,path);
}