c# - 进程无法访问文件,因为它被 mscorlib.dll 使用
问题描述
我写了一个 .dll 文件,它创建了带有 csv 扩展名的日志文件。问题是,只要它需要创建路径(因为它不存在),它就无法访问文件以在其中写入内容
void InitializePathDirectory(string dir)
{
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
}
void InitializeFileDirectory(string file)
{
if (!File.Exists(file))
{
File.Create(file);
}
}
这里的路径是
private string dirname = $"{path}\\Logs";
private string filename = $"{path}\\Logs\\{DateTime.Now.ToString("dd.MM.yyyy")}.csv";
当我关闭使用此 dll 的应用程序时,它通常会将我关闭应用程序的时间写入日志文件
public void onExit()
{
//var a is the DateTime, when the application starts
var b = DateTime.Now;
string temp = Convert.ToString(b - a);
string[] time = temp.Split('.');
File.AppendAllText(filename, $"Time:; {time[0]}\n");
File.AppendAllText(filename, $"Starttime:; {a.ToString("HH:mm:ss")}\n");
File.AppendAllText(filename, $"Endtime:; {b.ToString("HH:mm:ss")}\n\n");
}
但如果日志文件路径是在同一次运行中创建的,我无法将任何内容写入文件,它会引发异常,即“mscorlib.dll”当前使用日志文件,所以我无法访问它
解决方案
UsingFile.Create()
返回一个文件流,它允许您读取/写入新创建的文件。如果不处理/关闭此流,它将导致文件保持打开状态,从而阻止您随后调用File.AppendAllText()
.
您有2 3种方法来处理此问题:
- 将您的调用包含在 using 块中:
using (File.Create(filename)) {}
- 手动调用文件流上的 dispose:
File.Create(filename).Dispose();
- 根本不要使用
File.Create()
。该File.AppendAllText()
方法已经检查文件是否存在,如果不存在则创建它,因此File.Create()
完全多余且没有必要:打开文件,将指定的字符串附加到文件,然后关闭文件。如果文件不存在,此方法创建一个文件,将指定的字符串写入文件,然后关闭文件。
最后,正如@Tofik在现已删除的答案中指出的那样,您的呼叫Directory.Exists(dir)
也是多余的。请参阅文档Directory.CreateDirectory(dir)
:
在指定路径中创建所有目录和子目录,除非它们已经存在。
推荐阅读
- android - Android DataBinding KAPT 增量支持
- python - 如果在运行时多次运行同一个 dag 会发生什么?
- r - 将参数列表传递给 mutate_at
- r - 将 studpermu.test 与大型数据集一起使用时如何修复错误
- r - 根据列索引向量选择 data.table 值
- java - 如何在java中将日期字符串EEE MMM dd解析为yyyy-MM-dd
- r - 如何通过数据组循环函数?
- kubernetes - kubeadm 在内部 wifi 网络中的另一台计算机上加入
- nativescript - Nativescript Angular中的平台特定css
- java - 如何使用 Assertation (JUnit) 检查 int?