【编程小记】在Windows下使用C/C++代码判断一个文件是否被其他进程占用

在Windows下使用C/C++代码判断文件是否被占用

一、原理

Windows下有一个Windows API叫做CreateFile,通过这个接口我们可以创建或打开文件,我们打开文件时可以采用独占模式进行打开,如果能够打开文件说明这个文件没有被其他进程打开,如果打开失败说明该文件已经被其它进程打开了。

将该函数的第三个参数设置为0就是以独占模式进行打开文件

HANDLE CreateFile(
  [in]           LPCSTR                lpFileName,
  [in]           DWORD                 dwDesiredAccess,
  [in]           DWORD                 dwShareMode,
  [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  [in]           DWORD                 dwCreationDisposition,
  [in]           DWORD                 dwFlagsAndAttributes,
  [in, optional] HANDLE                hTemplateFile
);

二、函数简单介绍

参数

参数名描述
lpFileName要创建或打开的文件的名称。
dwDesiredAccess以何种方式打开文件, GENERIC_READ 读,GENERIC_WRITE 写, GENERIC_READ | GENERIC_WRITE 读写
dwShareMode文件的共享模式,0表示以独占模式打开文件。
lpSecurityAttributes一个指针,与文件安全有关。一般情况下设置为NULL,表示此函数返回的句柄不能被子进程继承,并且返回的句柄关联的文件获得默认安全描述符。
dwCreationDisposition要对存在或不存在的文件执行的操作。一般设置为OPEN_EXISTING,表示只有存在文件才打开,文件不存在,则该函数将调用失败,记录错误。
dwFlagsAndAttributes一般情况下直接设置为FILE_ATTRIBUTE_NORMAL
hTemplateFile当创建文件时以什么为模板进行创建文件。一般不使用,我们设置为NULL

返回值

  • 如果函数成功,则返回值是指定文件的打开句柄。
  • 如果该函数失败,则返回值为INVALID_HANDLE_VALUE

三、实例代码

#include <iostream>
#include <Windows.h>

int main()
{
	// 注意路径前面有一个L
	HANDLE Handle =  CreateFile(L"hello.pptx", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (INVALID_HANDLE_VALUE ==  Handle)
	{
		std::cout << "文件已经被其他进程占用!" << std::endl;
	}
	else
	{
		std::cout << "成功以独占模式打开文件!" << std::endl;
	}
	// 关闭句柄
	CloseHandle(Handle);
}

我们先打开hello.pptx文件,然后运行程序:

在这里插入图片描述

然后我们关闭hello.pptx文件,再次运行程序:

在这里插入图片描述


  • 这里是MSDN的官方文档:CreateFileA
  • 其中CreateFile是对CreateFileACreateFileW的别名,这样就可以根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSIUnicode 版本
  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Windows下,可以使用bat批处理脚本来批量检测远程端口。Telnet是一种远程终端连接服务,可以通过它来连接到远程主机的特定端口。以下是一个使用Telnet命令在批处理脚本中批量检测远程端口的例子: @echo off setlocal set ip_list=file_path\ip_list.txt set port=80 for /f %%i in (%ip_list%) do ( telnet %%i %port% | find "Connected" > nul if errorlevel 1 ( echo %%i:%port% is closed ) else ( echo %%i:%port% is open ) ) pause 在以上示例中,首先我们定义了要检测的IP列表文件的路径,即ip_list.txt文件,然后我们设定了要检测的端口号,此处设定为80端口。接着使用for循环读取ip_list.txt文件中的每个IP地址。 在每次循环中,我们使用telnet命令连接到远程主机的指定端口。如果端口成功连接,则表示端口是开放的,telnet命令的输出会包含"Connected"关键字。我们使用find命令查找telnet命令的输出中是否包含"Connected"关键字。 如果find命令找到了"Connected"关键字,则说明端口是开放的,我们将显示"IP地址:端口号 is open"的消息。否则,即端口未连接,我们将显示"IP地址:端口号 is closed"的消息。 最后,我们使用pause命令来暂停脚本的运行,以便我们可以查看检测结果。 需要注意的是,Telnet命令在默认情况下可能未启用,需要手动在Windows设置中启用Telnet客户端功能。此外,Telnet命令在Windows 10及更高版本中可能已被淘汰,可以考虑使用其他工具如ncat或PowerShell来代替Telnet命令进行远程端口检测。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七凌、

感谢,我会加油创作出更好的作品

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值