Web服务(iis express)保持文件打开

时间:2012-12-22 07:20:45

标签: c# web-applications iis-express

我需要创建一个sema4文件,限制其他会话尝试打开/写入数据库,如果另一个会话已经尝试执行相同的“事务”通过事务,在这种情况下进行类似的预订已经'正在进行中。

以下是代码:

  HttpSessionState ss = HttpContext.Current.Session;
  string sessionID = ss.SessionID;
  DirectoryInfo di = new DirectoryInfo(dataDirectory + "Semaphores");
  string facilityIDExt = requestedFacilityID.ToString().PadLeft(3, '0');
  string sema4File = string.Format("{0}.{1:yyyyMMdd}.{2}", sessionID, RequestedStartDT, facilityIDExt);
  sema4FilePath = Path.Combine(di.FullName, sema4File);
  File.Create(sema4FilePath);

  FileInfo[] fiPaths = di.GetFiles(string.Format("*.{0}", facilityIDExt));
  bool bookingInProgress = true;
  int waitPeriod = 60;
  while (waitPeriod > 0 && bookingInProgress)
  {
    fiPaths = di.GetFiles(string.Format("*.{0}", facilityIDExt));
    bookingInProgress = false;
    foreach (FileInfo item in fiPaths)
      if (item.Name.Contains(string.Format("{0:yyyyMMdd}.{1}", RequestedStartDT, facilityIDExt)) && item.Name != sema4File)
      {
        if (item.LastWriteTime > DateTime.Now.AddMinutes(-1))
        {
          bookingInProgress = true;
          break;
        }
      }
    System.Threading.Thread.Sleep(5000);
    waitPeriod = waitPeriod - 5;
  }

我们的想法是,实际预订在数据库中记录的时间不会少于60秒,但与此同时,不允许其他预订请求。

我遇到的问题是,当我致电以下时间时:

        if (File.Exists(sema4FilePath))
         File.Delete(sema4FilePath);

iisexpress不会删除该文件,因为它正在“使用中”。它正在被iisexpress“使用”。

我认为这也会发生在iis上。

我不明白为什么iisexpress会让sema4文件保持打开状态?

当我想删除sema4文件时,如何绕过“正在使用”问题?

1 个答案:

答案 0 :(得分:3)

执行此操作时:

File.Create(sema4FilePath);

你回来了一个FileStream。你应该关闭它以释放它。最好将其包装成使用:

using (var stream = File.Create(sema4FilePath)) {
  // Do you stuff
}

如果您不使用内容,请直接关闭:

File.Create(sema4FilePath).Close();