linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘网络学院网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > Delphi >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·HexToStr函数和StrToHex函数
·Delphi中的进制转换
·delphi轻松设置无边框透明窗体
·delphi第三方控件安装(Ehlib)
·DELPHI组件安装全攻略
·delphi动态创建控件
·开发工具比较Visual C++ VS De
·delphi完整身份证效验程序实例
·delphi中的Format函数详解
·delphi编程获取打印机的打印任
·如何判断文本文件的编码格式
·深入研究Variant数组
·用delphi编写网络游戏的外挂
·Delphi技巧-用户自定义数据类型
·delphi设置控件透明
最新文章
·在应用程序中跟踪MOUSE的坐标
·压缩和修复MS Access 2000文件
·DELPHI 6.0 动画制做
·怎样在Delphi中调用LastError信
·怎样得到主域服务器名称
·怎样利用递归实现删除某一目录
·读出主键下所有项
·如何制作照片底片效果的图像(
·获得Modem的状态
·WebBrowser屏幕滚动的实现,设
·有关字符串处理的小技巧
·Delphi建立键盘鼠标动作纪录与
·Delphi中布尔类型辨析
·DELPHI程序注册码设计
·图形的不规则的Copy
Google
 
利用Windows API判断文件共享锁定状态
[ 作者:  加入时间:2007-11-15 10:19:57  来自:Linux联盟收集整理 ]
锁是操作系统为实现数据共享而提供的一种安全机制,它使得不同的应用程序,不同的计算机之间可以安全有效地共享和交换数据。要保证安全有效地操作共享数据,必须在相应的操作前判断锁的类型,然后才能确定数据是否可读或可写,从而为开发出健壮的程序提供切实依据。jPkLinux联盟
同样,在Windows中,文件可以共享模式打开,它也涉及到锁的操作问题。根据Windows中文件共享时加锁范围的大小,锁可分为全局锁和局部锁;全局锁以锁定文件全部内容为特征,而局部锁以锁定文件的局部内容为特征,且文件的锁定区域不可重复。根据Windows中文件共享时锁的操作权限分类,锁可分为:读锁,写锁,读写锁(可读可写,全局锁)。jPkLinux联盟
利用上述文件中锁的区域不可重复的特性,我们可尝试给指定文件加一全局锁。若加锁成功,说明指定文件未被其它进程锁定;否则,说明有其它进程锁定了该文件。这里,我们利用两个Windows Api文件操作函数:OpenFile和CreateFile来实现锁定状态的判断。jPkLinux联盟
jPkLinux联盟
二、实现方法jPkLinux联盟
1. OpenFile函数使用说明jPkLinux联盟
函数原型:jPkLinux联盟
jPkLinux联盟
jPkLinux联盟
function OpenFile(const lpFileName: LPCSTR; var lpReOpenBuff: TOFStruct;jPkLinux联盟
uStyle: UINT): HFILE; stdcall;jPkLinux联盟
jPkLinux联盟
函数功能:以不同方式打开文件的操作(为兼容16位Windows程序保留的函数)。建议jPkLinux联盟
Windows下使用CreateFile函数。jPkLinux联盟
参数说明:lpFileName: 要打开文件的名称jPkLinux联盟
lpReOpenBuff: 变量指针,用于存储文件被首次打开时接收信息。jPkLinux联盟
UStyle: 打开文件的常量类型。jPkLinux联盟
常量名jPkLinux联盟
意义jPkLinux联盟
jPkLinux联盟
Of_CreatejPkLinux联盟
创建文件jPkLinux联盟
jPkLinux联盟
Of_DeletejPkLinux联盟
删除指定文件jPkLinux联盟
jPkLinux联盟
Of_ExistjPkLinux联盟
打开文件以验证其存在否?存在,返回一无效句柄;否则,返回负数jPkLinux联盟
jPkLinux联盟
Of_ParsejPkLinux联盟
填充lpReOpenBuff内容,但不进行任何操作jPkLinux联盟
jPkLinux联盟
Of_PromptjPkLinux联盟
如存在不存在,则显示一有重试和取消按钮的消息框jPkLinux联盟
jPkLinux联盟
Of_ReadjPkLinux联盟
只读方式打开jPkLinux联盟
jPkLinux联盟
Of_ReadWritejPkLinux联盟
读写方式打开jPkLinux联盟
jPkLinux联盟
Of_ReOpenjPkLinux联盟
打开lpReOpenBuff内指定的文件,而不依据lpFileNamejPkLinux联盟
jPkLinux联盟
Of_SearchjPkLinux联盟
强迫Windows查找文件---即使指定了文件路径jPkLinux联盟
jPkLinux联盟
Of_Share_CompatjPkLinux联盟
文件可由多个程序多次打开jPkLinux联盟
jPkLinux联盟
Of_Share_Deny_NonejPkLinux联盟
共享打开jPkLinux联盟
jPkLinux联盟
Of_Share_Deny_ReadjPkLinux联盟
禁止其它程序读该文件jPkLinux联盟
jPkLinux联盟
Of_Share_Deny_WritejPkLinux联盟
禁止其它程序写该文件jPkLinux联盟
jPkLinux联盟
Of_Share_ExclusivejPkLinux联盟
独占方式打开文件,其它程序不得再打开该文件jPkLinux联盟
jPkLinux联盟
Of_WritejPkLinux联盟
只写方式打开jPkLinux联盟
jPkLinux联盟
 jPkLinux联盟
返回值:成功,返回值为文件句柄(但可能无效,如:Of_Exist);出错,返回HFile_Error。jPkLinux联盟
2. CreateFile函数使用说明jPkLinux联盟
函数原型:jPkLinux联盟
jPkLinux联盟
jPkLinux联盟
function CreateFile(lpFileName: PChar;jPkLinux联盟
dwDesiredAccess, dwShareMode: DWORD;jPkLinux联盟
lpSecurityAttributes: PSecurityAttributes;jPkLinux联盟
dwCreationDisposition, dwFlagsAndAttributes: DWORD;jPkLinux联盟
hTemplateFile: THandle): THandle; stdcall;jPkLinux联盟
jPkLinux联盟
函数功能:以不同方式打开文件的操作,还可操作管道、邮槽、通信服务、设备以及控jPkLinux联盟
制台等。jPkLinux联盟
参数说明: lpFileName: 要打开文件的名称jPkLinux联盟
dwDesiredAccess:期望存取模式jPkLinux联盟
取值 0:只允许获取一个设备的相关信息。jPkLinux联盟
Generic_Read:只允许读设备jPkLinux联盟
Generic_Write:只允许写设备(二者可组合使用)。jPkLinux联盟
dwShareMode:共享模式。jPkLinux联盟
取值 0: 不共享。jPkLinux联盟
File_Share_Read和/或File_Share_Write:共享读和/或写。jPkLinux联盟
lpSecurityAttributes: 定义文件安全特性的指针(前提:操作系统支持)。jPkLinux联盟
DwCreationDisposition: 打开和创建文件方式。jPkLinux联盟
取值 Create_New: 总创建新文件,如文件已存在,则出错。jPkLinux联盟
Create_Always: 总创建新文件(会覆盖旧文件)。jPkLinux联盟
Open_Existing: 打开已存在的文件,若文件不存在,则出错。jPkLinux联盟
Open_Always: 总打开文件,如不存在,则创建。jPkLinux联盟
dwFlagsAndAttributes: 要打开文件的标志和属性(如:隐藏,系统等)。jPkLinux联盟
一般用File_Attribute_Normal,默认属性。jPkLinux联盟
hTemplateFile::模板文件句柄。jPkLinux联盟
若非0则指定一个文件句柄;否则,新文件将从这个文件复制jPkLinux联盟
扩展属性。jPkLinux联盟
返回值:成功,返回值为文件句柄;出错,返回Invalid_Handle_Value。jPkLinux联盟
jPkLinux联盟
3。程序实现jPkLinux联盟
利用上述两个函数,我们可编写程序判断某文件是否正在被其它进程锁定,以下为详细代码。jPkLinux联盟
jPkLinux联盟
jPkLinux联盟
//利用OpenFile Api函数判断jPkLinux联盟
function FileLocked(Fn: string): Boolean;jPkLinux联盟
varjPkLinux联盟
I : Integer;jPkLinux联盟
Struct: TOfStruct;jPkLinux联盟
Style: Cardinal;jPkLinux联盟
Hdl: Hfile;jPkLinux联盟
Drive: String;jPkLinux联盟
beginjPkLinux联盟
  Style := OF_Share_Exclusive;
//排它方式打开jPkLinux联盟
Drive := UpperCase(Fn[1]);jPkLinux联盟
  Struct.fFixedDisk := Ord(Drive <> ‘A‘);
//判断是否是硬盘jPkLinux联盟
Struct.cBytes := SizeOf(Struct);jPkLinux联盟
  For I := 1 to Length(Fn) dojPkLinux联盟
  Struct.szPathName[I-1] := Fn[I];jPkLinux联盟
  Struct.szPathName[I] := Chr(0);
//填充文件名jPkLinux联盟
Hdl := OpenFile(Pchar(Fn), Struct, Style);jPkLinux联盟
  if Hdl = HFILE_ERROR thenjPkLinux联盟
  beginjPkLinux联盟
    Result := True;
//文件被锁定jPkLinux联盟
Showmessage(SysErrorMessage(GetLastError));
//显示错误原因jPkLinux联盟
endjPkLinux联盟
  elsejPkLinux联盟
  Result := False;jPkLinux联盟
end;jPkLinux联盟
jPkLinux联盟
//利用CreateFile Api函数判断jPkLinux联盟
function LockedFile(Fn: string): Boolean;jPkLinux联盟
varjPkLinux联盟
AFile: THandle;jPkLinux联盟
SecAtrrs: TSecurityAttributes;jPkLinux联盟
beginjPkLinux联盟
  FillChar(SecAtrrs, SizeOf(SecAtrrs), #0);jPkLinux联盟
  SecAtrrs.nLength := SizeOf(SecAtrrs);
//结构体长度jPkLinux联盟
SecAtrrs.lpSecurityDescriptor := nil;
//安全描述jPkLinux联盟
SecAtrrs.bInheritHandle := True;
//继承标志jPkLinux联盟
AFile := CreateFile(PChar(Fn), GENERIC_READ or GENERIC_WRITE,jPkLinux联盟
  FILE_SHARE_Read, @SecAtrrs, OPEN_EXISTING,jPkLinux联盟
  FILE_ATTRIBUTE_Normal, 0);jPkLinux联盟
  if AFile = INVALID_HANDLE_VALUE thenjPkLinux联盟
  beginjPkLinux联盟
    Result := True;
//文件被锁定jPkLinux联盟
showmessage(SysErrorMessage(GetLastError));jPkLinux联盟
  endjPkLinux联盟
  elsejPkLinux联盟
  Result := False;jPkLinux联盟
end;jPkLinux联盟
jPkLinux联盟
4。程序的测试jPkLinux联盟
在Delphi中新建一Application,在Form1的OnCreate事件中写入:jPkLinux联盟
jPkLinux联盟
jPkLinux联盟
if Not FileLocked(‘c:\windows\desktop\a.txt’) then Showmessage(‘Cannot Open 1’);jPkLinux联盟
jPkLinux联盟
if Not LockedFile (‘c:\windows\desktop\a.txt’) then Showmessage(‘Cannot Open 2’);jPkLinux联盟
jPkLinux联盟
再新建一批处理文件保存到桌面上,内容为:jPkLinux联盟
jPkLinux联盟
dir c:\*.*/s>c:\windows\desktop\a.txt’jPkLinux联盟
jPkLinux联盟
运行此批处理文件,然后运行上述Delphi程序。这时候会出现消息框“其他进程正使用该文件, 因此现在无法访问。”。当批处理命令运行完毕后,再运行此程序则不会出现此信息。此时,再双击a.txt文档,记事本程序将无法打开该文档,说明加锁成功。jPkLinux联盟
jPkLinux联盟
三、结束语jPkLinux联盟
以上用两种方法实现了如何判断一个文件是否正被其它进程锁定。其中,方法一实现较为简单,但兼容性不好;而方法二为Windows推荐的方法,且功能强大。jPkLinux联盟
利用以上实现方法,较好地解决了Windows下文件锁定状态判断的问题。为避免发生共享冲突和提高文件操作程序的健壮性提供了很好的参考依据。jPkLinux联盟
jPkLinux联盟
以上程序在Windows98,Delphi6下测试通过。 Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
无相关信息