解除文件的独占锁定

今天看到一段代码:

HANDLE hFile = ::CreateFile( L"NUL", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);

刚开始还以为是作者写错了文件名,把“NULL”写成了"NUL"。可是经过查询才知道原来这段代码的作用是代开系统中的所有文件的句柄。然后往下继续所有资料,发现同过这种方式可以解除文件独占的锁定。具体方法:

BOOL GetVolumeNameByHandle(HANDLE hFile, LPTSTR szVolumeName, UINT cchMax)
{
	BOOL bResult = FALSE;
	TCHAR szBuf[500] = { 0 };
	TCHAR * pIter = szBuf;
	int i =0;
	BY_HANDLE_FILE_INFORMATION stFileInfo = { 0 };

	do
	{
		if(FALSE == GetFileInformationByHandle(hFile, &stFileInfo)) {
			break;
		}

		if(0== GetLogicalDriveStrings(_countof(szBuf), szBuf)) {
			break;
		}

		for(; pIter; pIter+=4)
		{
			DWORD dwVolumeSerialNumber =0;

			if(GetVolumeInformation(pIter, NULL, 0, &dwVolumeSerialNumber,
				NULL, NULL, NULL, 0))
			{
				if(dwVolumeSerialNumber == stFileInfo.dwVolumeSerialNumber)
				{
					lstrcpyn(szVolumeName, pIter, cchMax);
					bResult = TRUE;
					break;
				}
			}
		}

	} while (FALSE);

	return bResult;
}
BOOL GetFilePathFromHandleW(HANDLE hFile, LPTSTR lpszPath, UINT cchMax)
{
	BOOL bResult = FALSE;
	TCHAR szValue[MAX_PATH] = { 0 };

	IO_STATUS_BLOCK isb = { 0 };
	FILE_NAME_INFORMATION fni = { 0 };
	HANDLE hNtDll = NULL;
	PFN_ZwQueryInformationFile pfn_ZwQueryInformationFile = NULL;

	do
	{
		if (INVALID_HANDLE_VALUE==hFile || NULL==lpszPath ||0==cchMax) {
			break;
		}

		hNtDll = GetModuleHandle(TEXT("ntdll.dll"));
		if (NULL == hNtDll) {
			break;
		}

		pfn_ZwQueryInformationFile = (PFN_ZwQueryInformationFile)
			GetProcAddress(hNtDll, TEXT("ZwQueryInformationFile"));
		if (NULL == pfn_ZwQueryInformationFile) {
			break;
		}

		// 9 == FileNameInformation
		if (0!= pfn_ZwQueryInformationFile(hFile, &isb, &fni, sizeof(fni), 9)) {
			break;
		}

		if (FALSE == GetVolumeNameByHandle(hFile, szValue, _countof(szValue))) {
			break;
		}

		PathAppend(szValue, fni.FileName);

		lstrcpyn(lpszPath, szValue, cchMax);

		bResult = TRUE;
	} while (FALSE);
	return bResult;
}
BOOL DeleteLockedFile(DWORD dwProcessID, HANDLE hFile)
{
	TCHAR szTargetName[MAX_PATH] = { 0 };
	HANDLE hTargeFile = INVALID_HANDLE_VALUE;
	HANDLE hProcess = NULL;
	BOOL bResult = FALSE;

	do
	{
		hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
		if (NULL == hProcess) {
			break;
		}

		if (FALSE == DuplicateHandle(hProcess, hFile,
			GetCurrentProcess(), &hTargeFile,
			0, FALSE, DUPLICATE_SAME_ACCESS))
		{
			break;
		}

		if (INVALID_HANDLE_VALUE==hTargeFile || NULL==hTargeFile) {
			break;
		}

		if (FALSE == GetFilePathFromHandle(hTargeFile,
			szTargetName, _countof(szTargetName)))
		{
			break;
		}

		CloseHandle(hTargeFile);
		hTargeFile = INVALID_HANDLE_VALUE;

		if (0 == lstrlen(szTargetName)) {
			break;
		}

		if (FALSE == DuplicateHandle(hProcess, hFile,
			GetCurrentProcess(), &hTargeFile,
			0, FALSE,
			DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE))
		{
			break;
		}

		if (INVALID_HANDLE_VALUE==hTargeFile || NULL==hTargeFile) {
			break;
		}

		CloseHandle(hTargeFile);
		hTargeFile = INVALID_HANDLE_VALUE;

		bResult = DeleteFile(szTargetName);
	} while (FALSE);

	if (INVALID_HANDLE_VALUE != hTargeFile && NULL != hTargeFile) {
		CloseHandle(hTargeFile);
	}

	if (hProcess) {
		CloseHandle(hProcess);
	}
	return bResult;
}

1.任何运行中的程序或DLL都可以被删除,包括FileKill360本身

系统文件也可以删除,不过系统的文件检查会将其自动恢复,若关闭自动恢复或将dllcache中文件一起删除,也可以删除之

2.被独占打开的文件,被独占(拒绝读写共享)的文件,也可以删除

解除文件的独占锁定,布布扣,bubuko.com

时间: 2024-10-01 07:26:35

解除文件的独占锁定的相关文章

c# 删除程序占用的文件,强力删除文件,彻底删除文件,解除文件占用

c# 删除程序占用的文件,清理删除文件,彻底删除文件,解除文件占用 文件打开时,以共享读写模式打开 FileStream inputStream = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); p.BackgroundImage = new Bitmap(inputStream); inputStream.Dispose(); 删除文件 public void WipeFile(string

C#解除文件锁定

public static void StreamsFile(string fi) { try { var p = new Process { StartInfo = { FileName = Environment.CurrentDirectory + "\\streams64.exe", UseShellExecute = false, Arguments = " -d \""+fi+"\"" } }; //执行参数 p.

IIS Express魔法堂:解除localhost域名的锁定

一.前言   单点登录是通过域名从cookie中获取登录信息,然后再根据cookie的键值对获取用户信息.但由于通过IIS Express调试应用时默认使用localhost作为域名且无法直接修改,导致无法获取cookie信息.以前的做法就是直接将Web应用部署到IIS上,然后在VS中通过“附加进程”来调试,麻烦多了,也不便团队搭建开发环境. 今天花了一点时间查阅相关资料,终于不用再那么蛋痛了^_^.现在记录下来待日后查阅. 二.设置项目使用IIS Express Web项目右键->属性 三.配

TortoiseSVN上次文件显示被锁定

1.可以使用SVN clean up来清除锁定. 2.如果不是本目录锁定,系统提示上一层目录锁定,需要到上一层或者根目录中清除. 3.如果在根目录下都无法clean的话,一般采取的方法是另外找一个目录重新CHECKOUT.但有时有时SVN目录下可能有一些自己本地修改的文件, 还未提交到SVN服务器,这时重新CHECKOUT需要注意本地文件的备份,并且不要强制覆盖服务器上其它人修改的内容. 4.如果觉得第3种很麻烦,可以考虑这样的方法.其实SVN加锁会在.SVN(隐藏文件)中生成一个名字叫lock

linux chown命令解除文件夹的root权限限制

sudo chown -R demouser file 这个命令可以解除linux文件的超级权限限制 摘录: chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名或者组ID:文件是以空格分开的要改变权限的文件列表,支持通配符.系统管理员经常使用chown命令,在将文件拷贝到另一个用户的名录下之后,让用户拥有使用该文件的权限. 1.命令格式: chown [选项]... [所有者][:[组]] 文件... 2.命令功能: 通过chown改变文件的拥有者和群组.

用户登录程序,读取文件用户名,锁定写入文件

读取文件: mport json user_list = { 'andy': "123456", 'william':'123456', 'abc': "123456", 'bcd':'123456', 'cde': '123456', 'def': "123456", 'efg': '123456', } jsObj = json.dumps(user_list)fileObject = open('jsonFile.json', 'w')fi

解除文件、目录占有,轻松删除文件

当文件,或者目录下文件被一些程序打开,这时后想删除文件或者目录,而不能删除,使用此脚本可以轻松删除. 下载Handle.zip文件 https://docs.microsoft.com/zh-cn/sysinternals/downloads/handle解压到任意地方 bat 批处理 @echo offrem handle可执行文件SET "handle=C:\Users\too\Desktop\Handle\handle.exe"rem 要删除的文件SET "appfil

ASP怎么解除文件上传200kb限制

第一步:修改IIS设置,允许直接编辑配置数据库.打开,Internet信息服务第二步:先在服务里关闭iis admin service服务,找到windows\system32\inetsrv\下的metabase.xml, 打开,找到ASPMaxRequestEntityAllowed 把他修改为需要的值,默认为204800,即200K,如把它修改为51200000(50M).然后重启iis admin service服务.

转载 IO、文件、NIO【草案四】

本章目录: 1.IO类相关内容 2.文件和目录 3.文件高级操作  NIO详解[1]——缓冲区(Buffer)[深入理解,总结自<Java-NIO>]: [*:下边的Buffer又指代抽象的缓冲区结构模型,同样代表Java语言里面的Buffer类的实例,这里不区分二者的概念了.] Buffer类基本概念: 一般而言,Buffer的数据结构是一个保存了原始数据的数组,在Java语言里面封装成为一个带引用的对象.Buffer一般称为缓冲区,该缓冲区的优点在于它虽然是一个简单数组,但是它封装了很多数