这个简单问题我都问了第四遍了,谁要是回答出来我给100分:如何以独占方式(fmShareExclusive)打开一个文本文件?

时间:2022-06-16 14:35:02
就是该文件被我打开以后,别的进程不能读取,否则显示“共享违例”信息框,
在VC下很简单的:
    CFile f("c:\\test.txt", CFile::modeReadWrite | CFile::modeShareExclusive);


急啊!!!

23 个解决方案

#1


有人知道吗?再做不出来我就要被炒了。5555555555

#2


用FileOpen(FileName, fmShareExclusive)

#3


我试过了,不行的不信你自己试一试:
FileOpen('c:\test.txt',fmShareExclusive)
ShowMessage('Opened');


然后运行两次该程序,你会发现能同时打开该文件。


#4


试试这两个函数
LockFile
UnLockFile

#5


唉......
我试过了,不行的不信你自己试一试:
if FileOpen('c:\test.txt',fmShareExclusive)=-1 then  //A return value of -1
   ShowMessage('Opened');                  //indicates that an error occurred.



然后运行两次该程序,你会发现不能同时打开该文件。
                          ~~~~

#6


错了
唉......
我试过了,可以的不信你自己试一试:
if FileOpen('c:\test.txt',fmShareExclusive)=-1 then  //A return value of -1
  ShowMessage('Opened');                  //indicates that an error occurred.
                                           //the error will occure while a
                                           //file open second.


然后运行两次该程序,你会发现不能同时打开该文件。

#7


up

#8


谢谢 heifei(): 你是对的。
但是我想用TextFile,然后用Writeln和Readln来操作该文件,这时该怎么办?

#9


随便说说,用createfile得到文件句柄,设置相应属性,然后再。。。。

#10


concern

#11


用TFILESTREAM可以实现,看下面的帮助:
Creates an instance of TFileStream.

constructor Create(const FileName: string; Mode: Word);

Description

Call Create to instantiate a file stream for reading from or writing to the named file. Specify the name of the file and the way the file should be opened as parameters.

The Mode parameter indicates how the file is to be opened. The Mode parameter consists of an open mode and a share mode or抏d together. The open mode must be one of the following values:

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.

The share mode must be one of the following values:

Value Meaning

fmShareCompat Sharing is compatible with the way FCBs are opened.
fmShareExclusive Other applications can not open the file for any reason.
fmShareDenyWrite Other applications can open the file for reading but not for writing.
fmShareDenyRead Other applications can open the file for writing but not for reading.
fmShareDenyNone No attempt is made to prevent other applications from reading from or writing to the file.

If the file can not be opened, Create raises an exception.

#12


这样我刚试过,在showmessage我未点确定之前,我没法访问1.txt
procedure TForm1.Button1Click(Sender: TObject);
var F:THandle;
var Buffer:Array [0..100] of Char;
var Len:Dword;
begin
        F:=CreateFile('1.txt',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
        if F=0 then
        begin
                ShowMessage('Error');
        end;
        //GetMem(Buffer,100);
        FillChar(Buffer,100,0);
        //ZeroMemory(PChar(Buffer),100);
        ReadFile(F,Buffer,100,Len,nil);
        ShowMessage(StrPas(Buffer));
        ShowMessage(inttostr(Len));
end;

#13


各位帮我想想办法:
    能不能在打开文本文件(TextFile)的时候使用独占方式?
按照Delphi帮助的提示,有一个全局变量“FileMode”,它控制着打开文件的方式
但是我试过了,好像FileMode不起作用,代码如下:

var
  F: TextFile;
begin
  FileMode := fmOpenReadWrite or fmShareExclusive; 
  try 
    AssignFile(F, 'c:\test.txt');
    ShowMessage('Succeeded');
  except
    ...
  end;

其中FileMode是全局变量,它的说明详见Reset的说明

#14


明白了,你想一独占方式打开文本文件并读写吧:
var
  f,: integer;
  s: array [0..99] of char;
  MyStr: string;
begin
  MyStr:= 'abcd';
  StrPCopy(s, MyStr+#13#10);
  f:= FileOpen('c:\test.txt',fmShareExclusive or fmOpenReadWrite);
  fileSeek(f,0,2);
  fileWrite(f, s, SizeOf(MyStr)+2);
  fileclose(f);
end;

#15



你的FileMode使用方法和赋值不太妥当.
另外,这个变量只能控制AccessMode,
不能控制ShareMode,达不到你的要求.

#16


顿悟FileMode不起作用的原因,谢谢heifei()兄
你在上面实现了Writeln,那么Readln如何实现?可能要繁一点

#17


没时间了,
我要下班了,sorry
读取文件看帮助照做就行了,应该不难.

#18


gz

#19


我不知道你想独占文本文件是为了什么,如果仅仅是为了不让不同的进程同时访问的话,那么,有一种变通的办法:但是这种方法我也觉得不怎么样
if 文件属性不是只读 then
begin
  将文件属性设为只读;
  以读写方式打开文件,使用文件;//切记一定要以读写方式打开!
  将文件属性设为读写;
end
else
begin
  提示用户“文件己被其它进程打开”
end;

#20


另外,还有一个办法:安装一个系统监视程序,然后监视一下Word打开文件是如何操作的。

#21


happyzxj(happyzxj)你好聪明,我这样就是为了进程间共享数据

#22


GZ

#23



var
  F: THandle;
begin
  if FileExists('abc.dat') then
    F := FileOpen('abc.dat', fmShareExclusive)
  else 
    F := FileOpen('abc.dat', fmCreate);
  try
    FileWrite(F, PChar('abc')^, length('abc'));
  finally
    CloseHandle(F);
  end;
end; 

#1


有人知道吗?再做不出来我就要被炒了。5555555555

#2


用FileOpen(FileName, fmShareExclusive)

#3


我试过了,不行的不信你自己试一试:
FileOpen('c:\test.txt',fmShareExclusive)
ShowMessage('Opened');


然后运行两次该程序,你会发现能同时打开该文件。


#4


试试这两个函数
LockFile
UnLockFile

#5


唉......
我试过了,不行的不信你自己试一试:
if FileOpen('c:\test.txt',fmShareExclusive)=-1 then  //A return value of -1
   ShowMessage('Opened');                  //indicates that an error occurred.



然后运行两次该程序,你会发现不能同时打开该文件。
                          ~~~~

#6


错了
唉......
我试过了,可以的不信你自己试一试:
if FileOpen('c:\test.txt',fmShareExclusive)=-1 then  //A return value of -1
  ShowMessage('Opened');                  //indicates that an error occurred.
                                           //the error will occure while a
                                           //file open second.


然后运行两次该程序,你会发现不能同时打开该文件。

#7


up

#8


谢谢 heifei(): 你是对的。
但是我想用TextFile,然后用Writeln和Readln来操作该文件,这时该怎么办?

#9


随便说说,用createfile得到文件句柄,设置相应属性,然后再。。。。

#10


concern

#11


用TFILESTREAM可以实现,看下面的帮助:
Creates an instance of TFileStream.

constructor Create(const FileName: string; Mode: Word);

Description

Call Create to instantiate a file stream for reading from or writing to the named file. Specify the name of the file and the way the file should be opened as parameters.

The Mode parameter indicates how the file is to be opened. The Mode parameter consists of an open mode and a share mode or抏d together. The open mode must be one of the following values:

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.

The share mode must be one of the following values:

Value Meaning

fmShareCompat Sharing is compatible with the way FCBs are opened.
fmShareExclusive Other applications can not open the file for any reason.
fmShareDenyWrite Other applications can open the file for reading but not for writing.
fmShareDenyRead Other applications can open the file for writing but not for reading.
fmShareDenyNone No attempt is made to prevent other applications from reading from or writing to the file.

If the file can not be opened, Create raises an exception.

#12


这样我刚试过,在showmessage我未点确定之前,我没法访问1.txt
procedure TForm1.Button1Click(Sender: TObject);
var F:THandle;
var Buffer:Array [0..100] of Char;
var Len:Dword;
begin
        F:=CreateFile('1.txt',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
        if F=0 then
        begin
                ShowMessage('Error');
        end;
        //GetMem(Buffer,100);
        FillChar(Buffer,100,0);
        //ZeroMemory(PChar(Buffer),100);
        ReadFile(F,Buffer,100,Len,nil);
        ShowMessage(StrPas(Buffer));
        ShowMessage(inttostr(Len));
end;

#13


各位帮我想想办法:
    能不能在打开文本文件(TextFile)的时候使用独占方式?
按照Delphi帮助的提示,有一个全局变量“FileMode”,它控制着打开文件的方式
但是我试过了,好像FileMode不起作用,代码如下:

var
  F: TextFile;
begin
  FileMode := fmOpenReadWrite or fmShareExclusive; 
  try 
    AssignFile(F, 'c:\test.txt');
    ShowMessage('Succeeded');
  except
    ...
  end;

其中FileMode是全局变量,它的说明详见Reset的说明

#14


明白了,你想一独占方式打开文本文件并读写吧:
var
  f,: integer;
  s: array [0..99] of char;
  MyStr: string;
begin
  MyStr:= 'abcd';
  StrPCopy(s, MyStr+#13#10);
  f:= FileOpen('c:\test.txt',fmShareExclusive or fmOpenReadWrite);
  fileSeek(f,0,2);
  fileWrite(f, s, SizeOf(MyStr)+2);
  fileclose(f);
end;

#15



你的FileMode使用方法和赋值不太妥当.
另外,这个变量只能控制AccessMode,
不能控制ShareMode,达不到你的要求.

#16


顿悟FileMode不起作用的原因,谢谢heifei()兄
你在上面实现了Writeln,那么Readln如何实现?可能要繁一点

#17


没时间了,
我要下班了,sorry
读取文件看帮助照做就行了,应该不难.

#18


gz

#19


我不知道你想独占文本文件是为了什么,如果仅仅是为了不让不同的进程同时访问的话,那么,有一种变通的办法:但是这种方法我也觉得不怎么样
if 文件属性不是只读 then
begin
  将文件属性设为只读;
  以读写方式打开文件,使用文件;//切记一定要以读写方式打开!
  将文件属性设为读写;
end
else
begin
  提示用户“文件己被其它进程打开”
end;

#20


另外,还有一个办法:安装一个系统监视程序,然后监视一下Word打开文件是如何操作的。

#21


happyzxj(happyzxj)你好聪明,我这样就是为了进程间共享数据

#22


GZ

#23



var
  F: THandle;
begin
  if FileExists('abc.dat') then
    F := FileOpen('abc.dat', fmShareExclusive)
  else 
    F := FileOpen('abc.dat', fmCreate);
  try
    FileWrite(F, PChar('abc')^, length('abc'));
  finally
    CloseHandle(F);
  end;
end;