Delphi判断文件是否正在被使用
2010-07-06 19:48
首先,我们先来认识下CreateFile函数,它的原型如下
HANDLE CreateFile(
LPCTSTR lpFileName, //指向文件名的指针
DWORD dwDesiredAccess, //访问模式(写/读)
DWORD dwShareMode, //共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
DWORD dwCreationDisposition, //如何创建
DWORD dwFlagsAndAttributes, //文件属性
HANDLE hTemplateFile //用于复制文件句柄
);
下面是参数的说明
lpFileName
指向一个空结尾字符串。该参数指定了用于创建或打开句柄的对象。
如果lpFileName的对象是一个路径,则有一个最大字符数的限制。不能超过常量(MAX_PATH).这个限制指示了CreateFile函数如何解析路径.
dwDesiredAccess
指定对象的访问方式,程序可以获得读访问权,写访问权,读写访问权或者是询问设备("device query") 访问权.
这个参数可以是下列值的任意组合
0
指定询问访问权.程序可以在不直接访问设备的情况下查询设备的属性.
GENERIC_READ
指定读访问权.可以从文件中读取数据,并且移动文件指针.可以和GENERIC_WRITE组合成为"读写访问权".
GENERIC_WRITE
指定写访问权.可以从文件中写入数据,并且移动文件指针.可以和GENERIC_READ组合成为"读写访问权".
dwShareMode
设置位标志指明对象如何共享.如果参数是0, 对象不能够共享. 后续的打开对象的操作将会失败,直到该对象的句柄关闭.
使用一个或多个下列值的组合来共享一个对象.
FILE_SHARE_DELETE
WINDOWS NT:后续的仅仅请求删除访问权的打开操作将会成功.
FILE_SHARE_READ
后续的仅仅请求读访问权的打开操作将会成功.
FILE_SHARE_WRITE
后续的仅仅请求写访问权的打开操作将会成功.
lpSecurityAttributes
指向一个 SECURITY_ATTRIBUTES 结构的指针用于确定如何在子进程中继承这个句柄.如果这个参数是NULL,则该句柄不可继承.

dwCreationDisposition
指定当文件存在或者不存在时如何动作。关于这个参数更多的信息,参考批注部分。这个参数必须是一个或多个下列值。
CREATE_NEW
创建一个新文件. 如果该文件已经存在函数则会失败.

CREATE_ALWAYS
创建一个新文件.如果该文件已经存在,函数将覆盖已存在的文件并清除已存在的文件属性

OPEN_EXISTING
打开一个文件,如果文件不存在函数将会失败.
如查你使用CreateFile函数为设备装载控制台.请查看批注中的"为什么使用OPEN_EXISTING标志"的部分.

OPEN_ALWAYS
如果文件存在,打开文件. 如果文件不存在,并且参数中有CREATE_NEW标志,则创建文件.

TRUNCATE_EXISTING
打开一个文件,每次打开,文件将被截至0字节.调用进程必须用GENERIC_WRITE访问模式打
开文件.如果文件不存在则函数就会失败.
dwFlagsAndatributes
为文件指定属性和标志位
该参数可以接收下列属性的任意组合.除非其它所有的文件属性忽略FILE_ATTRIBUTE_NORMAL.
FILE_ATTRIBUTE_ARCHIVE
文件将被存档,程序使用此属性来标志文件去备份或移除
FILE_ATTRIBUTE_HIDDEN
文件被隐藏,它不会在一般文件夹列表中被装载.
FILE_ATTRIBUTE_NORMAL
文件没有被设置任何属性.

FILE_ATTRIBUTE_OFFLINE
文件的数据没有被立即用到。指出正在脱机使用该文件。
FILE_ATTRIBUTE_READONLY
这个文件只可读取.程序可以读文件,但不可以在上面写入内容,也不可删除.
FILE_ATTRIBUTE_SYSTEM
文件是系统的一部分,或是系统专用的.
FILE_ATTRIBUTE_TEMPORARY
文件被使用后,文件系统将努力为(文件的)所有数据的迅迅访问保持一块
内存。临时文件应当在程序不用时及时删除。

来源:(http://blog.sina.com.cn/s/blog_4960dbcb0100gofb.html) - Delphi判断文件是否正在被使用_海底两万里_新浪博客

dwFlagAndAttributes可以接受下列标志的任意组合。

FILE_FLAG_WRITE_THROUGH
指示系统通过快速缓存直接写入磁盘.
FILE_FLAG_OVERLAPPED
指示系统初始化对象, 此操作将对进程设置一个引用计数并返回ERROR_IO_PENDING.处理完成后, 指定对象将被设置为信号状态.当你指定FILE_FLAG_OVERLAPPED时,读写文件的函数必须指定一个OVERLAPPED结构.并且. 当FILE_FLAG_OVERLAPPED被指定, 程序必须执行重叠参数(指向OVERLAPPED结构)去进行文件的读写.这个标志也可以有超过一个操作去执行.
FILE_FLAG_NO_BUFFERING
指示系统不使用快速缓冲区或缓存,当和FILE_FLAG_OVERLAPPED组合,该标志给出最大的异步操作量, 因为I/O不依赖内存管理器的异步操作.然而,一些I/O操作将会运行得长一些,因为数据没有控制在缓存中.当使用FILE_FLAG_NO_BUFFERING打开文件进行工作时,程序必须达到下列要求:
  1. 文件的存取开头的字节偏移量必须是扇区尺寸的整倍数.
  2. 文件存取的字节数必须是扇区尺寸的整倍数.例如,如果扇区尺寸是512字节程序就可以读或者写512,1024或者2048字节,但不能够是335,981或者7171字节.
  3. 进行读和写操作的地址必须在扇区的对齐位置,在内存中对齐的地址是扇区尺寸的整倍数.
  4. 一个将缓冲区与扇区尺寸对齐的途径是使用VirtualAlloc函数. 它分配与操作系统内存页大小的整倍数对齐的内存地址.因为内存页尺寸和扇区尺寸--2都是它们的幂.
  5. 这块内存在地址中同样与扇区尺寸大小的整倍数对齐.
  6. 程序可以通过调用GetDiskFreeSpace来确定扇区的尺寸.
FILE_FLAG_RANDOM_ACCESS
指定文件是随机访问,这个标志可以使系统优化文件的缓冲.

FILE_FLAG_SEQUENTIAL_SCAN
指定文件将从头到尾连续地访问.这个标志可以提示系统优化文件缓冲. 如果程序在随机访问文件中移动文件指针,优化可能不会发生;然而,正确的操作仍然可以得到保证
指定这个标志可以提高程序以顺序访问模式读取大文件的性能, 性能的提高在许多程序读取一些大的顺序文件时是异常明显的.但是可能会有小范围的字节遗漏.

FILE_FLAG_DELETE_ON_CLOSE
指示系统在文件所有打开的句柄关闭后立即删除文件.不只有你可以指定FILE_FLAG_DELETE_ON_CLOSE如果没有使用FILE_SHARE_DELETE,后续的打开文件的请求将会失败.
FILE_FLAG_BACKUP_SEMANTICS
WINDOWS NT:指示系统为文件的打开或创建执行一个备份或恢复操作. 系统保证调用进程忽略文件的安全选项,倘若它必须有一个特权.则相关的特权则是SE_BACKUP_NAME和SE_RESTORE_NAME.
你也可以使用这个标志获得一个文件夹的句柄,一个文件夹句柄能够象一个文件句柄一样传给某些Win32函数。
FILE_FLAG_POSIX_SEMANTICS
指明文件符合POSIX标准.这是在MS-DOS与16位Windows下的标准.
FILE_FLAG_OPEN_REPARSE_POINT
指定这个标志制约NTFS分区指针.该标志不能够和CREAT_ALWAYS一起使用.
FILE_FLAG_OPEN_NO_RECALL
指明需要文件数据,但是将继续从远程存储器中接收.它不会将数据存放在本地存储器中.
这个标志由远程存储系统或等级存储管理器系统使用.
hTemplateFile
为GENERIC_READ访问的模式指定一个句柄到模板文件.模板文件在文件开始创建后提供文件属性和扩展属性.
Return Values
返回值
如果函数成功,返回一个打开的指定文件的句柄.如果指定文件在函数调用前已经存在并且dwCreation参数是CREATE_ALWAYS 或者OPEN_ALWAYS,调用GetLastError就会返回ERROR_ALREADY_EXISTS(表示函数成功). 如果函数文件在调用前不存在则会返回0.
如果函数失败,返会值会是INVALID_HANDLE_VALUE. 更多的错误信息可以调用GetLastError来获得.
==================================================================================
“判断文件是否正在被使用”的函数更容易理解一些,函数如下:

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); //如果CreateFile返回失败那么Result为真(即文件正在被使用)
if not Result then //如果CreateFile函数返回是成功
CloseHandle(HFileRes); //那么关闭句柄
end;

函数的调用方法:IsFileInUse(要判断的文件路径); 如果函数返回True 则正在使用,False则文件现在没被使用

实例:清

//Iswrite := IsFileInUse(Edit3.text+'/Rupsmon.dat.txt');

//把logLines的日志保留logCount行

//        if logLines > logCount then
//            begin
//             ShowMessage(inttostr(logLines));
//               for i:=1 to logLines-logCount do
//                 begin
//               with   TStringList.Create   do
//               try
//                LoadFromFile(Edit3.text+'/Rupsmon.dat.txt');//FileNamew为你的文本文件名称
//                Delete(1);//n为你想要删除的行,0代表第一行。
//                SaveToFile(Edit3.text+'/Rupsmon.dat.txt');
//               except
//                Free;
//               end;
//                 end;
//             end;

Delphi判断文件是否正在被使用相关推荐

  1. java判断文件写完_Java_判断文件是否写入完成

    /** * 等待文件(非目录)读写完毕,费时的操作,不要放在主线程 * * @param file 文件 */ private void waitForWirtenCompleted(File fil ...

  2. Delphi判断一个文件是不是JPG图片

    Delphi判断一个文件是不是JPG图片文件 function IsJpegFile(FileName: string): Boolean; const RightBuf : array[0..3] ...

  3. 用文件的 sha1值判断文件是否重复(delphi语言)

    在不同语言环境中,要判断一个文件是否重复比较麻烦.通过文件的一般标准的sha1算法,得到文件的HASH值判断文件重复是可行的,多可文档系统即可中提供了delphi语言的判断函数,如下: unit Id ...

  4. 【delphi】判断文件的编码方式(ANSI、Unicode、UTF8、UnicodeBIG)

    在开发中,经常会碰到文件编码格式不正确,有时也需要进行编码转换,具体的编码原理可以自行查找,这里记录下我的处理方式.根据这个原理稍加修改即可实现编码转换和自动判断. {判断文件的编码方式,可以实现编码 ...

  5. Delphi的文件操作

    参考自:http://www.cnblogs.com/railgunman/articles/1800318.html Delphi 中默认有input 和 output 两个文件变量,使用可以不用定 ...

  6. 教程-Delphi资源文件(全面分析于使用)

    Delphi资源文件(全面分析之位图.光标.图标.AVI.JPEG.Wave)   几乎每个Windows应用程序都使用图标.图片.光标等资源.资源是程序的一部分,但是它是不可执行代码.下面我们就详细 ...

  7. 怎样从PHP文件中提取特征码,关于判断文件唯一性,怎么提取特征码

    关于判断文件唯一性,怎么提取特征码 Delphi / Windows SDK/API http://www.delphi2007.net/DelphiAPI/html/delphi_200611081 ...

  8. Delphi 创建文件并写入内容,以及FileCreate释放的方法

    Delphi在向文件写入内容时,经常需要判断文件是否存在,如果存在,用TStringList读取内容,并将新加入的内容加入容器中.如果文件不存在,就创建文件,而后写入,可是经常会碰到文件正在使用的错误 ...

  9. c++ 判断文件夹是否存在,不存在则创建(可建多级目录)

    c++中,<io.h>中的_access可以判断文件是否存在,<direct.h>中的_mkdir可以创建文件. 建单级目录: #include <io.h> #i ...

最新文章

  1. 无线传输层安全协议WTLS安全机制详解
  2. 中国商业智能(BI)市场发展趋势及未来投资潜力评估报告2022-2028年版
  3. python字符串的split replace strip
  4. Powershell管理系列(十一)Exchange完全访问权限邮箱的设置
  5. 十大经典排序算法动画与解析(配代码完全版)
  6. appcan slider轮播图和页面弹动冲突解决
  7. 更小的刘海和更宽的5G天线,下一代iPhone你期待吗?
  8. MongoDB数据库(二):增删查改
  9. 手机通话记录重复显示怎么处理_手机通话记录怎么找回
  10. java重命名文件(附道客巴巴文档下载方法)
  11. 数字交易所内存撮合、无锁并发技术源码
  12. 使用strace查看后台程序stdout输出
  13. 如何用wps自动生成目录,你学会了吗?
  14. thinkphp+vue傻瓜式PS级可视化自助建站系统平台版
  15. 计算机名打印机无法共享,打印机共享不了怎么回事 打印机共享不了原因和解决办法【详解】...
  16. 【windows】SCCM部署系统时遇到的错误
  17. YDOOK:ANSYS 进行电磁场仿真的第四步:后处理 查看计算结果
  18. java steam_Java 8 Steam 例子整理
  19. 白社会正式开放注册 搜狐全面进军SNS市场
  20. 王者荣耀微信和QQ服务器怎么一起玩游戏,王者荣耀微信和qq能一起吗 可以一起玩吗...

热门文章

  1. php utf8 或gbk 截取字符串乱码解决
  2. nyoj 712 探寻宝藏
  3. NYOJ 248 BUYING FEED (贪心)
  4. Golang之Go Module使用
  5. java之hiberante之集合映射之list映射
  6. 浅谈Configure和Setting
  7. Navicat for mysql导入.sql数据库大小受限制
  8. 让你的网站在移动端健步如飞
  9. 光脚丫学LINQ(025):如何验证DBML和外部映射文件
  10. PCA方法对特征降维