Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在web应用程序中检查文件是否存在的最佳方法是什么?_.net_File - Fatal编程技术网

.net 在web应用程序中检查文件是否存在的最佳方法是什么?

.net 在web应用程序中检查文件是否存在的最佳方法是什么?,.net,file,.net,File,我已经创建了一个web应用程序,它每天都在创建和更新xml文件。i、 e.创建一个xml作为currentdate.xml。这有用户访问的所有记录,即IP、参考者、访问页面等 因此,多个用户同时更新同一个文件。那么,检查文件存在与更新的最佳实践是什么呢 我得到“另一个进程正在使用文件” 谢谢, Laxmilal您不应该在多线程应用程序中使用文件,因为并发性问题 例如,文件的以下内容: 推荐人: RefReferrer: 错误: 推荐人: 这是一个非常基本的问题 相反,您可以使用基于文件的数据库(

我已经创建了一个web应用程序,它每天都在创建和更新xml文件。i、 e.创建一个xml作为currentdate.xml。这有用户访问的所有记录,即IP、参考者、访问页面等

因此,多个用户同时更新同一个文件。那么,检查文件存在与更新的最佳实践是什么呢

我得到“另一个进程正在使用文件”

谢谢,
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
    将处理该问题
另一种选择是使用能够更好地处理并发性的Log4net。 因此,您可以将统计数据写入日志文件:

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中工作。当多个应用程序写入同一文件时,需要进程范围的锁


也许您可以使用日志框架,例如(例如)。它们是为您处理线程安全而设计的。

如果您确实必须这样做,请不要使用文件,而是使用数据库。