FileMode.Create和FileMode.Truncate之间有什么区别?

11

我不太理解它:

FileMode.Create 如果文件不存在,则创建一个新文件,如果文件已存在,则覆盖该文件。

FileMode.Truncate 不创建新文件,但会删除现有文件的所有内容,因此基本上也会覆盖文件。

那么为什么还有这种可能性呢:

public void DoStuff()
{
    using (FileStream fs = File.Open(path, FileMode.Truncate, FileAccess.Write, FileShare.None))
    {
        //Do something
    }
}

当足够做到以下几点时:

public void DoStuff()
{
    using (FileStream fs = File.Open(path, FileMode.Create, FileAccess.Write, FileShare.None))
    {
        //Do something
    }
}

因为两者基本上都是使用空文件来写入内容

.NET封装器公开了底层winapi函数(CreateFile)所能做的一切。您可以在不使用所有功能的情况下拥有非常高效的编程生涯。意外情况确实会发生。 - Hans Passant
1
“有什么区别”?嗯,你在问题中已经写了:“Truncate不会创建新文件”。何时使用它:当您想要覆盖文件的内容,但不想在不存在文件时创建它时。 - Franz Gleichmann
2个回答

16

对于FileMode.Truncate,文件必须存在。如果不存在,将引发异常。在这种情况下,FileMode.Create会创建一个新文件。

输入图像描述


1
但是为什么你应该使用它呢?你可以坚持使用File.Create。 - DudeWhoWantsToLearn
7
和使用 Single() 而非 First() 的原因相同。如果你的逻辑假定文件应该存在,最好使用 FileMode.Truncate 来得到通知,说明文件不存在,从而确定问题所在。 - maxc137

0

这个问题听起来好像两个选项可能同时需要:

  • 如果旧文件存在,则截断它;
  • 如果不存在,则创建一个新文件。

我的解决方法是:

public void DoStuff()
{
    var fileInfo = new FileInfo(path);
    var fileMode = fileInfo.Exists ? FileMode.Truncate : FileMode.CreateNew;
    using (FileStream fs = File.Open(path, fileMode, FileAccess.Write, FileShare.None))
    {
        //Do something
    }
}

4
FileMode.Create 实现了与 fileInfo.Exists ? FileMode.Truncate : FileMode.CreateNew 相同的功能(文档)。 - maxc137

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