如何判断一个Word文件是否处于打开状态?(50分)

  • 主题发起人 主题发起人 houtor
  • 开始时间 开始时间
H

houtor

Unregistered / Unconfirmed
GUEST, unregistred user!
如何判断一个硬盘上的某个Word文件是否处于打开状态?
 
函数功能:检查文件是否正在被使用
参数fname:被检查的文件名
返回值:True正在被使用
false没有被使用
}
function IsFileInUse(fName : string ) : boolean;
var
HFileRes : Tfilestream;
begin
Result := false;
if not FileExists(fName) then
exit;
try
hfileres:=Tfilestream.create(fname,fmShareExclusive);
result:=false;
except
result:=true;
end;
try
hfileres.Free;
except
end;
end;
 
问题: 如何判断一个文件是否已经被打开? ( 积分: 50 )
分类: 系统相关

来自: brightangel, 时间: 2000-08-13 1:10:24, ID: 306968
我想用比较简单的方法判断一个文件是否被任何一个程序以任何方式使用?
请高手指教。



来自: 追命, 时间: 2000-08-13 1:31:23, ID: 306981
请试试WINDOWS API函数,查找当前的文件的状态,再进行判断.

来自: brightangel, 时间: 2000-08-13 12:39:18, ID: 307205
用哪个API函数,能详细点吗?
不胜感激!

来自: David Jiang, 时间: 2000-08-14 9:41:31, ID: 307937
当一个文件程序正在使用,文件是受到保护的,可用MoveFile 尝试移动文件,失败即在使用。

来自: wumeng, 时间: 2000-08-14 9:53:40, ID: 307957
to David Jiang:
您的方法对HTML文件就不适用.

来自: kucio, 时间: 2000-08-14 10:00:06, ID: 307967
MoveFile不行,只对可执行文件有效。

来自: crystal, 时间: 2000-08-14 10:48:48, ID: 308023
g

来自: beta, 时间: 2000-08-14 11:08:28, ID: 308050
尝试写它,要是不行,就说明。。。

来自: crystal, 时间: 2000-08-14 11:42:59, ID: 308082
可是我觉得如果不是有程序在Exclusive的使用,写是没问题的...

来自: brightangel, 时间: 2000-08-14 12:33:40, ID: 308122
同意crystal,例如文本文件,
即使你用NotePad打开它,在程序也是可以写的。


来自: lww, 时间: 2000-08-14 14:18:53, ID: 308245
GetFileAttributes
具体自己看msdn吧

来自: onedot, 时间: 2000-08-14 16:05:01, ID: 308404
确实是用getfileattributes,得到FILE_ATTRIBUTE_TEMPORAR,因为如果文件被打开
那么在系统的缓存中一定有此文件,所以得到值包含FILE_ATTRIBUTE_TEMPORARY

来自: only you, 时间: 2000-08-14 23:19:21, ID: 308831
function IsFileInUse(fName : string) : boolean;
var
HFileRes : HFILE;
begin
Result := false;
if not FileExists(fName) then
exit;
HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE,
0 {this is the trick!}, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
Result := (HFileRes = INVALID_HANDLE_VALUE);
if not Result then
CloseHandle(HFileRes);
end;

来自: lop, 时间: 2000-08-15 8:27:11, ID: 309014
关注此题

来自: cHengyAng, 时间: 2000-08-21 9:41:48, ID: 314246
你可以监视文件调用API,如果读或写操作与你所指定的文件相同,就...OK?


来自: brightangel, 时间: 2000-08-21 13:11:22, ID: 314513
only you 的方法很好,判断word,excel文档都正确,
但对文本文件好象不适用。
我用notepad打开文本文件后再用only you的方法判断,
结果是文件未被使用,难道notepad载入文本后,
就关闭了文件句柄吗?
或者文本文件本身就与word等其它文件不同?
请指教!



来自: polygon, 时间: 2000-08-21 13:35:38, ID: 314542
Notepad的确是在文件载入后关闭文件句柄,所有的操作
在自己的内存里处理,所以才会有64K文件限制.

来自: fenghualiang, 时间: 2000-08-21 18:19:08, ID: 314840
写字板打开文本文件后好象也一样。
那么写字板处理的文件长度有限制吗?
如果有,限制是多少呢?


来自: only you, 时间: 2000-08-24 23:30:47, ID: 317712
注意!Notepad只有在Windows95-98下才有64K限制,当在真正的32位操作系统NT40下时这个限制
将取消,并且其采用与其他文件同样的读写机制!

来自: Another_eYes, 时间: 2000-08-24 23:56:45, ID: 317740
尝试用独占方式打开呗. 如果打不开就是正在使用.

来自: brightangel, 时间: 2000-08-25 19:23:21, ID: 318504
多人接受答案了。

得分大富翁: Another_eYes-2,beta-2,cHengyAng-2,crystal-2,David Jiang-2,fenghualiang-5,kucio-2,lww-2,onedot-2,only you-20,polygon-2,wumeng-5,追命-2,
 
procedure TFcgjhinput.XPButton12Click(Sender: TObject);
var
AFile: OleVariant;
begin
AFile:=ExtractFilePath(ParamStr(0))+'/Doc1.Doc';
Try
wordapplication1.Documents.Open(AFile,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
Except
messagebox(handle,'文件处于打开状态!','提示:',0+64);
wordapplication1.ActiveDocument.Close(EmptyParam,EmptyParam,EmptyParam);
worddocument1.Disconnect;
wordapplication1.Disconnect;
exit;
end;
Wordapplication1.visible := true;
HDocMode:=Wordapplication1.activedocument;
 
多人接受答案了。
 
后退
顶部