2010-06-27 157 views
5

我正在使用TFileSteam来打开日志文件。我希望能够从其他进程读取此日志文件。我认为fmShareDenyWrite模式会允许这样做。fmShareDenyWrite模式看起来不起作用

但是,如果我尝试从其他进程打开文件,我得到一个错误。例如,如果我尝试从命令行输入文件,则会得到“该进程无法访问该文件,因为该文件正在被另一个进程使用”。

下面是该文件的初始化代码:

if FileExists(AutoLogFileName) then 
    _ActivityLogStream := TFileStream.Create(AutoLogFileName, 
      fmOpenReadWrite or fmShareDenyWrite) 
else 
    _ActivityLogStream := TFileStream.Create(AutoLogFileName, 
      fmCreate or fmShareDenyWrite); 

注: 我使用德尔福版本6.

+1

其他应用程序打开它使用什么模式? – mj2008 2010-06-27 21:10:06

回答

8

不知道这是否已经在D6中的错误,但是这是一个明显的可能性。有关D2007报告的QC报告:QC 65767:http://qc.embarcadero.com/wc/qcmain.aspx?d=65767。这份报告现已结束,因为它在D2010中得到了解决(确切地说是14.0.3467.22472)。

更新(由贾布尔的评论提示):

您可以创建自己的TFileStream的后裔,做孝敬模式。只需重写Create(const AFileName: string; Mode: Word; Rights: Cardinal)构造函数(有两个重载的构造函数)并自己处理模式参数。将代码从原来的构造复制和更改

if Mode = fmCreate then 
    begin 
    inherited Create(FileCreate(AFileName, Rights)); 

if (Mode and fmCreate = fmCreate) then 
    begin 
    myMode := Mode and $FF; 
    if myMode = $FF then 
     myMode := fmShareExclusive; 
    inherited Create(FileCreate(AFileName, myMode, Rights)); 

其中myMode的类型是Word的一个局部变量。

+0

该QC条目也提供了解决方案。 – gabr 2010-06-28 06:24:03

2

mfCreate模式不与任何份额属性行为/正常工作。要解决,你必须创建文件处理自己并把它传递给构造

欢呼

+0

你能给我一个代码示例吗? – Aheho 2010-06-28 03:31:20