吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2409|回复: 31
收起左侧

[求助] python如果关闭已经探知打开的文件(已解决)

[复制链接]
ymhld 发表于 2020-3-25 11:04
本帖最后由 ymhld 于 2020-3-26 16:24 编辑

查到网上的一些代码,能探知是否由其他应用打开某文件,但怎么能关闭已经打开的文件呢
[Python] 纯文本查看 复制代码
#-*- coding: utf-8 -*-
from ctypes import windll
import time
import win32file
from  win32file import  *
 
def is_open(filename):
 
    try:
        #首先获得句柄
        vHandle =win32file.CreateFile(filename, GENERIC_READ, 0, None, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, None)
        #判断句柄是否等于INVALID_HANDLE_VALUE
        if int(vHandle)==INVALID_HANDLE_VALUE:
            print("# file is already open")
            return True  # file is already open
        win32file.CloseHandle(vHandle)
 
    except Exception as e:
        print(e)

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

先有我后有天 发表于 2020-3-25 12:13
这些不都是模块的函数吗,你去查相关文档啊,应该有说明
win32file.CloseHandle(vHandle
这个不就是用关闭上面分析都文件吗
 楼主| ymhld 发表于 2020-3-25 13:33
先有我后有天 发表于 2020-3-25 12:13
这些不都是模块的函数吗,你去查相关文档啊,应该有说明
win32file.CloseHandle(vHandle
这个不就是用关 ...

你看上面的脚本,Vhandle是没有找到,产生了错误,才显示的文件被占用
先有我后有天 发表于 2020-3-25 13:57
ymhld 发表于 2020-3-25 13:33
你看上面的脚本,Vhandle是没有找到,产生了错误,才显示的文件被占用

我不知道你想问什么,按代码理解应该就是createfile函数的参数产生的的结果使得句柄的值做相应改变,你可以看这个函数的详细解释,
https://www.cnblogs.com/happy-kitty/p/11801583.html
葫芦炒鸡蛋 发表于 2020-3-25 13:59
类似于360和火绒的解除文件占用功能,猜测是调用系统函数实现的。
 楼主| ymhld 发表于 2020-3-25 14:27
先有我后有天 发表于 2020-3-25 13:57
我不知道你想问什么,按代码理解应该就是createfile函数的参数产生的的结果使得句柄的值做相应改变,你可 ...

我的想法是探知到文件被占用后,想办法关闭这个文件,好重新用别的打开进行操作,但直接用那个close(vhandle),方法不对
 楼主| ymhld 发表于 2020-3-25 14:33
葫芦炒鸡蛋 发表于 2020-3-25 13:59
类似于360和火绒的解除文件占用功能,猜测是调用系统函数实现的。

对,能被探知是占用了,我想关闭打开的文件,知道怎么关吗
 楼主| ymhld 发表于 2020-3-25 14:45
先有我后有天 发表于 2020-3-25 13:57
我不知道你想问什么,按代码理解应该就是createfile函数的参数产生的的结果使得句柄的值做相应改变,你可 ...

[Python] 纯文本查看 复制代码
from ctypes import windll
import time
import win32file
from  win32file import  *
 
def is_open(filename):
 
    try:
        #首先获得句柄
        vHandle =win32file.CreateFile(filename, GENERIC_READ, 0, None, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, None)
        #判断句柄是否等于INVALID_HANDLE_VALUE
        print(vHandle)
        if int(vHandle)==INVALID_HANDLE_VALUE:
            print("# file is already open")
            return True  # file is already open
        win32file.CloseHandle(vHandle)
 
    except Exception as e:
        print(e)
        vHandle=(CreateFile(filename,
                                 0,
                                 0,
                                 None,
                                 OPEN_EXISTING,
                                 0,
                                 None ))
        win32file.CloseHandle(vHandle)
        return True

print (is_open('2020年公司经营总表.xlsx'))


这样还是关闭不了
Virgo之最 发表于 2020-3-25 20:32
你这只是调用 CreateFile 判断文件是否占用
如果文件已经占用 CreateFile 就会报错 所以不可能获取到 句柄  也就是代码中的 vHandle

如果要找到打开文件的句柄, 需要枚举进程 然后创建句柄查看是否属于已经打开的文件.

https://www.cnblogs.com/mayingkun/p/7764377.html
https://blog.csdn.net/weixin_30875157/article/details/98158318


或者直接调用其他第三方程序, 比如说 Windows Sysinternals提供的 handle.exe
还有 Unlocker 等等
 楼主| ymhld 发表于 2020-3-25 20:57
Virgo之最 发表于 2020-3-25 20:32
你这只是调用 CreateFile 判断文件是否占用
如果文件已经占用 CreateFile 就会报错 所以不可能获取到 句柄 ...

好的,谢谢,我试一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-15 06:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表