TFileStream 如何以共享方式打开文件? ( 积分: 100 )

  • 主题发起人 主题发起人 qqjm
  • 开始时间 开始时间
Q

qqjm

Unregistered / Unconfirmed
GUEST, unregistred user!
我用TFileStream打开一个文件后,别的程序都不能打开这个文件进行操作了,如用记事本打开会报“另一个程序正在使用此文件,进程无法访问。”。
代码如下:
File3:= TFileStream.Create('C:/1.txt',fmOpenReadWrite,fmShareDenyNone);
File2:= TFileStream.Create('C:/1.txt',fmOpenReadWrite,fmShareDenyNone );//执行到这里出错!报:另一个程序正在使用此文件,进程无法访问。

问:如何用TFileStream打开文件,但可以使别的程序可以对文件进行读写操作。
有其它方法也可以!

注:我用C#做过这样的程序,完全可以做到,怎么delphi7做不来呢!
C#代码:
file1= new System.IO.FileStream(@"C:/1.txt",System.IO.FileMode.OpenOrCreate ,System.IO.FileAccess.ReadWrite ,System.IO.FileShare.ReadWrite);
file2 = new System.IO.FileStream(@"C:/1.txt",System.IO.FileMode.OpenOrCreate ,System.IO.FileAccess.ReadWrite ,System.IO.FileShare.ReadWrite);
 
因为你使用的是fmOpenReadWrite
 
打开文件的模式只有四个:
Value Meaning

fmCreate Create a file with the given name. If a file with the given name exists, open the file in write mode.
fmOpenRead Open the file for reading only.
fmOpenWrite Open the file for writing only. Writing to the file completely replaces the current contents.
fmOpenReadWrite Open the file to modify the current contents rather than replace them.

我要进行读写操作不用fmOpenReadWrite 用什么?
就算我用fmOpenRead还是报错!
是不是Delphi的问题?
 
TFileStream.Create(..., fmOpenReadWrite or fmShareDenyNone, ...);
看帮助/源代码都能找到答案...
 
to purwind
完全OK,谢了。
delphi的帮助我看了很多次,但是反而被误导了。
因为平时都没有看源码的习惯,没想到出现了这个问题会是broland的一个失误。
 
FileOpen example
---------------------------------------
procedure OpenForShare(const FileName: String);

var
FileHandle : Integer;
begin
FileHandle := FileOpen(FileName, fmOpenWrite or fmShareDenyNone);//共享方式打开文件的方法
if FileHandle > 0 then
{valid file handle}
else
{Open error: FileHandle = negative DOS error code}
end;
===============================
TFileStream的Create函数。。。。。
constructor TFileStream.Create(const FileName: string; Mode: Word; Rights: Cardinal);
begin
if Mode = fmCreate then
begin
inherited Create(FileCreate(FileName, Rights));
if FHandle < 0 then
raise EFCreateError.CreateResFmt(@SFCreateErrorEx, [ExpandFileName(FileName), SysErrorMessage(GetLastError)]);
end
else
begin
inherited Create(FileOpen(FileName, Mode));//很明显这里应该是用Mode or Rights 才对
if FHandle < 0 then
raise EFOpenError.CreateResFmt(@SFOpenErrorEx, [ExpandFileName(FileName), SysErrorMessage(GetLastError)]);
end;
end;
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
943
DelphiTeacher的专栏
D
D
回复
0
查看
882
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
959
DelphiTeacher的专栏
D
后退
顶部