吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

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

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

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

查到网上的一些代码,能探知是否由其他应用打开某文件,但怎么能关闭已经打开的文件呢
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
#-*- 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] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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-4-13 14:09

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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