在 C# 中使用 File.Create 覆盖同时创建的日志文件

问题描述 投票:0回答:2

我在 C# 中使用 File.Exists 来确定是否存在动态命名的日志文件,如果不存在,则使用 File.Create 创建该文件。文件命名方案为 Logfile_20241009.txt,其中的数字是使用日期动态生成的。我唯一担心的是,对于当天的第一个条目,两个请求可能会在完全相同的时间发生,并且一个请求的记录可能会被另一个请求覆盖。这会引发某种我可以检查的异常吗?我是不是想太多了?

c# io
2个回答
0
投票

我在 C# 中使用 File.Exists 来确定是否存在动态命名的日志文件,如果不存在,则使用 File.Create 创建该文件。
...
我是不是想太多了?

是的。

在访问文件之前检查

File.Exists()
几乎总是错误的。文件系统是“易失性”的,文件的存在可以在您检查它的行和您使用它的行之间发生变化。此外,存在只是您可能遇到问题的众多原因之一。因此,归根结底,您仍然需要一个异常处理程序 一旦有了异常处理程序,

File.Exists()

检查不仅是多余的,而且是额外的驱动器 I/O,这几乎是在单台计算机中可以做的最慢的事情......甚至比堆栈更慢、更浪费展开需要处理异常,这是我们避免控制流异常的主要原因。

此外,

File.Append_()

系列方法将

已经
创建一个新文件(如果需要)。 换句话说,您可以通过更改为使用如下模式来降低代码的复杂性并提高性能:

void LogMessage(string Message) { var fileName = Path.Combine("base path here", $"Logfile_{DateTime.Now:yyyyMMdd}.txt"); try { File.AppendAllText(fileName, Message); } catch(Exception ex) { // decide how to handle failures here // ... or not. It may be best to just let them bubble up to the main application } }

请注意,如果需要,

File.AppendAllText()

 将已经创建文件:

打开文件,将指定的字符串附加到文件,然后关闭文件。
如果文件不存在,此方法会创建一个文件

(强调我的)


0
投票
File.Create

,而是调用

File.Open(string, fileMode)
(
https://learn.microsoft.com/en-us/dotnet/api/system.io.file.open?view=net-8.0#system-io- file-open(system-string-system-io-filemode)
),并传递 FileMode
FileMode.OpenOrCreate
如果文件存在,则打开该文件;如果文件不存在,则创建一个新文件。或者,如果由于某种原因无法打开文件(例如其他线程已锁定文件),则抛出异常。

© www.soinside.com 2019 - 2024. All rights reserved.