Python中的文件处理:由另一个进程使用

时间:2015-09-27 07:29:33

标签: python debugging python-3.x logging file-handling

我做了这个脚本,它的上传记录一些键击一段时间将它们保存在一个文件中然后擦除文件,如果用户想要但是当脚本试图删除文件时我得到了这个错误。

  

Traceback(最近一次调用最后一次):文件   " C:\ Users \ Tormentor \ Desktop \ S.D.A.K.L \ pregunta.py",第34行,in   os.remove(path2 +" \" + name)PermissionError:[WinError 32]   进程无法访问该文件,因为它正被另一个文件使用   过程:' C:\用户\公共\ myfile.txt的'

我做了一些研究,我认为它不能删除,因为我的" snp"函数永远不会关闭记录键击的文件,那么如何关闭文件以删除它? 谢谢你的帮助:)。

import os
import time
import pyHook, pythoncom, sys, logging

path="C:\\Users\\Public\\myfile.txt"

path2="C:\\Users\\Public"

name="myfile.txt"

TinM=10

def snp(event):    #<---------- Not closing file ???
    global path
    logging.basicConfig(filename=path, level=logging.DEBUG, format='%(message)s')
    chr(event.Ascii)
    logging.log(10,chr(event.Ascii))
    return True


timeout=time.time()+TinM
while timeout > time.time():
    hooks_manager = pyHook.HookManager()
    hooks_manager.KeyDown = snp
    hooks_manager.HookKeyboard()
    print("Logging keystrokes")
    pythoncom.PumpWaitingMessages()
else:
    hooks_manager.UnhookKeyboard()
    x=input("Keylogger stoped do you want to delete the archive? y / n")
    if x == "y":
        for(path2,dirs,files) in os.walk(path2):
            if name in files:
                os.remove(path2+"\\"+name) # <----- This line triggers the error.
                print("Archive deleted. Goodbye")
            else:
                print("Archive does not exist or cant be found goodbye! :D")
    else:
        print("Goodbye! :D")

1 个答案:

答案 0 :(得分:0)

该文件由您自己的流程保持打开状态。

logging.basicConfig(filename=path, level=logging.DEBUG...

打开filename指定的文件。在流程退出或调用logging.shutdown()之前,它不会关闭它,因此您可以在shutdown()函数中调用snp()

但是,这要求每次按下某个键时都会初始化日志记录,这是非常低效的。更好的设计是在脚本的主要部分中调用logging.basicConfig() 一次,并在删除文件之前调用logging.shutdown()。然后您的snp()功能变为:

def snp(event):
    logging.log(logging.DEBUG, chr(event.Ascii))
    return True

和脚本的主要部分:

logging.basicConfig(filename=path, level=logging.DEBUG, format='%(message)s')
timeout=time.time()+TinM
while timeout > time.time():
    hooks_manager = pyHook.HookManager()
    hooks_manager.KeyDown = snp
    hooks_manager.HookKeyboard()
    print("Logging keystrokes")
    pythoncom.PumpWaitingMessages

hooks_manager.UnhookKeyboard()
logging.shutdown()
x=input("Keylogger stoped do you want to delete the archive? y / n")
if x == "y":
    for(path2,dirs,files) in os.walk(path2):
        if name in files:
            os.remove(path2+"\\"+name) # <----- This line triggers the error.
            print("Archive deleted. Goodbye")
        else:
            print("Archive does not exist or cant be found goodbye! :D")
else:
    print("Goodbye! :D")

请注意,我还从else语句中删除了while子句,因为它始终针对您显示的代码执行。