ymhld 发表于 2020-3-25 11:04

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

本帖最后由 ymhld 于 2020-3-26 16:24 编辑

查到网上的一些代码,能探知是否由其他应用打开某文件,但怎么能关闭已经打开的文件呢

#-*- coding: utf-8 -*-
from ctypes import windll
import time
import win32file
fromwin32file 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函数的参数产生的的结果使得句柄的值做相应改变,你可 ...
from ctypes import windll
import time
import win32file
fromwin32file 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 就会报错 所以不可能获取到 句柄 ...

好的,谢谢,我试一下
页: [1] 2 3 4
查看完整版本: python如果关闭已经探知打开的文件(已解决)