检查是否存在创建新 c# 的文件
本文关键字:文件 创建 是否 存在 检查 | 更新日期: 2023-09-27 18:35:27
如果文件存在或在那一刻正在使用,我该如何创建新的日志1,日志2,日志3等。现在,当我启动应用程序时,我无法启动第二个,因为日志文件正在使用中。我必须创建第二个日志文件或以某种方式写入同一个文件?
编辑:
这是对我有用的解决方案。
if (String.IsNullOrEmpty(this.LogFile1))
{
string fn = "''log.txt";
while (File.Exists(fn))
{
fn = "''log1.txt";
}
this.LogFile1 = fn;
}
return this.LogFile1;
对我的代码进行一些编辑:
if (!File.Exists(this.LogFile))
{
log = new StreamWriter(this.LogFile);
}
else
{
log = File.AppendText(this.LogFile);
}
现在,如果我有日志.txt程序将创建新的log1.txt。如果它们都存在,将创建 log11.txt依此类推。
你可以使用这个:
if (String.IsNullOrEmpty(this.LogFile1))
{
string fn = "LogFile";
while (File.Exists(fn))
{
fn = fn + "1";
}
this.LogFile1 = fn;
}
return this.LogFile1;
试试这个。这是我使用的,它工作正常
StreamWriter sw;
if (!File.Exists(path))
{
sw = File.CreateText(path);
}
else
{
sw = File.AppendText(path);
}
sw.WriteLine(ex.Message);
sw.Flush();
sw.Close();
编辑
如果你想记录信息,最好使用log4net
文章 : log4net C# 代码片段
这是适合您的代码
if (!File.Exists("''log.txt"))
{
FileInfo fileinfo = new FileInfo("''log.txt");
if(IsFileinUse(fileinfo))
{
//create new one
log = new StreamWriter("''log.txt");
}
else
{
log = File.AppendText("''log.txt");
}
检查文件是否正在使用中....
protected virtual bool IsFileinUse(FileInfo file)
{
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
//the file is unavailable because it is:
//still being written to
//or being processed by another thread
//or does not exist (has already been processed)
return true;
}
finally
{
if (stream != null)
stream.Close();
}
return false;
}
我通过将try/catch添加到我的项目中来处理这个问题
try
{
using (Stream stream = new FileStream(@"'log.txt", FileMode.Open))
{
//Write to your log file here
}
}
catch (Exception ex)
{
//you can check here why it failed
}
在 catch 方法中,您可以使用 ex。消息和 if 语句来处理它。例如。。。这里的MyError将是I/O文件不存在或文件正在使用中,但您可以自己轻松测试
不要在下面的代码片段中,您将在名称中包含日期的同一位置创建一个新的日志文件。这样,您就可以确定具有唯一的文件名,并且如果您正在搜索问题,则可以轻松浏览日志文件。
if (ex.Message == "MyError")
{
string filename = String.Format("{1}_{0:yyyy-MM-dd}", @"log", DateTime.Now);
string fullpath = Path.Combine(@"'",filename);
using (StreamWriter sw = File.CreateText(path))
{
//This is where you will write your text to the new file if the other one was in use
sw.WriteLine("something....");
}
}
编辑:
有关可在异常处理中使用的文件处理异常,请参阅此处,使用异常处理将确保应用程序不会崩溃。
http://msdn.microsoft.com/en-us/library/system.io.filenotfoundexception(v=vs.71).aspx
希望这有帮助。
干杯凯文
错误的方式解决问题; 与其尝试发明自己的方法来创建新文件,不如简单地使用现有的库(如NLog或log4net)为您完成此操作,该库已经解决了并发访问和其他考虑的所有问题。
我也不知道 log4net,但对于 NLog,你可以这样做(log4net 应该类似):
1)下载NLog,将其作为参考添加到您的项目中
2) 通过创建 NLog.config 并将其设置为在构建时复制到输出文件夹来配置 NLog。 下面是一个简单的配置文件,如果文件太大,它将简单地记录到当前目录并存档:
<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true">
<targets>
<target name="targetFile" xsi:type="File" fileName="log.txt" archiveAboveSize="1000000" archiveNumbering="Sequence" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="targetFile" />
</rules>
</nlog>
3) 将其添加到您的类属性(以及您要记录的任何其他位置):
private readonly Logger logger = LogManager.GetCurrentClassLogger();
然后,任何时候你想记录,只需做:
logger.Info(responseFromServer);
编辑:
在我的测试中,如果一次出现太多消息并且它必须争取对文件的访问(但是,它不会引发异常),NLog 使用的并发写入算法可能会丢弃消息。 如果要通过在配置文件中插入 ${processid} 来确保永远不会丢失消息,则可以将每个进程日志设置为自己的文件,用于日志位置,如下所示:
<target name="targetFile" xsi:type="File" fileName="log_${processid}.txt" archiveAboveSize="1000000" archiveNumbering="Sequence" />
Dim logFile As StreamWriter
If File.Exists(("C:'Logs'log1.txt")) Then
logFile = File.AppendText("C:'Logs'log1.txt")
Else
logFile = File.CreateText("C:'Logs'log1.txt")
End If