文件读/写locking

我有一个应用程序,我打开一个日志文件的写作。 在某个时间点(应用程序运行时),我使用Excel 2003打开文件,该文件应该以只读方式打开。 对我来说没问题。

但是我的应用程序抛出了这个exception:

System.IO.IOException:进程无法访问文件,因为另一个进程已locking文件的一部分。

我不明白如何Excel可以locking文件( 我的应用程序有写权限),并导致我的应用程序无法写入!

为什么会发生?

(注意:我没有观察到Excel 2007的这种行为。)

这里是一个会照顾同步锁的logging器。 (您可以修改它以符合您的要求)

using System; using System.Collections.Generic; using System.Text; using System.IO; namespace Owf.Logger { public class Logger { private static object syncContoller = string.Empty; private static Logger _logger; public static Logger Default { get { if (_logger == null) _logger = new Logger(); return _logger; } } private Dictionary<Guid, DateTime> _starts = new Dictionary<Guid, DateTime>(); private string _fileName = "Log.txt"; public string FileName { get { return _fileName; } set { _fileName = value; } } public Guid LogStart(string mesaage) { lock (syncContoller) { Guid id = Guid.NewGuid(); _starts.Add(id, DateTime.Now); LogMessage(string.Format("0.00\tStart: {0}", mesaage)); return id; } } public void LogEnd(Guid id, string mesaage) { lock (syncContoller) { if (_starts.ContainsKey(id)) { TimeSpan time = (TimeSpan)(DateTime.Now - _starts[id]); LogMessage(string.Format("{1}\tEnd: {0}", mesaage, time.TotalMilliseconds.ToString())); } else throw new ApplicationException("Logger.LogEnd: Key doesn't exisits."); } } public void LogMessage(string message) { lock (syncContoller) { string filePath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); if (!filePath.EndsWith("\\")) filePath += "\\owf"; else filePath += "owf"; if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath); filePath += "\\Log.txt"; lock (syncContoller) { using (StreamWriter sw = new StreamWriter(filePath, true)) { sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.sss") + "\t" + message); } } } } } } 

你怎么写日志? 有你自己的开放/closures或使用三十派对产品?

我只是在写入内容时才打开并locking日志。 数据写入完成后,代码将closures文件,当然还会释放locking

这似乎是一个.NET的问题。 (好吧,如果你问我一个问题)。

基本上我已经通过使用以下multithreading代码复制该问题:

  Dim FS As System.IO.FileStream Dim BR As System.IO.BinaryReader Dim FileBuffer(-1) As Byte If System.IO.File.Exists(FileName) Then Try FS = New System.IO.FileStream(FileName, System.IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read) BR = New System.IO.BinaryReader(FS) Do While FS.Position < FS.Length FileBuffer = BR.ReadBytes(&H10000) If FileBuffer.Length > 0 Then ... do something with the file here... End If Loop BR.Close() FS.Close() Catch ErrorMessage = "Error(" & Err.Number & ") while reading file:" & Err.Description End Try 

基本上,错误是试图读取文件与所有不同的共享模式(读,写,READ_WRITE)绝对没有影响的文件locking,不pipe你尝试什么; 你总是会得到相同的结果:被locking,不可用于任何其他用户。

微软甚至不会承认这个问题。

解决scheme是使用内部的Kernel32 CreateFile API来完成适当的访问,因为这可以确保操作系统在请求读取共享locking或locking访问的文件时监听您的请求。

我相信我有相同types的locking问题,转载如下:

  • 用户1从networking(读写)打开Excel2007文件(WindowsServer,版本为unkn)。
  • 用户2打开相同的Excel文件(当然打开为ReadOnly)。
  • 用户1成功保存文件多次

在某些时候,用户1由于消息说“文件被locking”而无法保存文件。 closures用户2的ReadOnly版本…locking被释放,用户1现在可以再次保存。

在ReadOnly模式下打开文件如何在该文件上locking?

所以,这似乎是一个Excel2007问题,或服务器问题。