.net 在web应用程序中检查文件是否存在的最佳方法是什么?
我已经创建了一个web应用程序,它每天都在创建和更新xml文件。i、 e.创建一个xml作为currentdate.xml。这有用户访问的所有记录,即IP、参考者、访问页面等 因此,多个用户同时更新同一个文件。那么,检查文件存在与更新的最佳实践是什么呢 我得到“另一个进程正在使用文件” 谢谢,.net 在web应用程序中检查文件是否存在的最佳方法是什么?,.net,file,.net,File,我已经创建了一个web应用程序,它每天都在创建和更新xml文件。i、 e.创建一个xml作为currentdate.xml。这有用户访问的所有记录,即IP、参考者、访问页面等 因此,多个用户同时更新同一个文件。那么,检查文件存在与更新的最佳实践是什么呢 我得到“另一个进程正在使用文件” 谢谢, Laxmilal您不应该在多线程应用程序中使用文件,因为并发性问题 例如,文件的以下内容: 推荐人: RefReferrer: 错误: 推荐人: 这是一个非常基本的问题 相反,您可以使用基于文件的数据库(
Laxmilal您不应该在多线程应用程序中使用文件,因为并发性问题 例如,文件的以下内容: 推荐人:
RefReferrer:
错误:
推荐人: 这是一个非常基本的问题 相反,您可以使用基于文件的数据库(例如SQLite),当然也可以使用适当的数据库(不一定是RDBMS) 或者在最坏的情况下,您必须手动同步写入操作:
static class Stats {
static object locker = new object();
public static Write(string someData) {
lock(locker) {
using (var stream = File.Open("pathtofile", FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
using (var writer = new StreamWriter(stream)) {
writer.WriteLine(someData);
}
}
}
}
请注意:
- 同步在一个且仅在一个应用程序中处理(因此通常不能有多个进程处理该文件
- 您不需要检查文件是否存在。
将处理该问题FileMode.Append
static class Stats {
private static readonly ILog log = LogManager.GetLogger(typeof (Stats));
public static Write(string someData) {
log.Info(someData)
}
}
我同意Toms的反应:如果可以,请使用数据库。它是为多线程访问而设计的。如果出于任何原因无法实现,请尝试不写入其他文件以防止异步异常。否则,您可以尝试使用锁,如下所示:
private static readonly object locker = new object();
public static void MyMethodThatWritesToFile()
{
lock(locker)
{
// Do file IO here.
}
}
请注意,这只能在单个AppDomain中工作。当多个应用程序写入同一文件时,需要进程范围的锁
也许您可以使用日志框架,例如(例如)。它们是为您处理线程安全而设计的。如果您确实必须这样做,请不要使用文件,而是使用数据库。