首页 > 解决方案 > 检查文件是否已写入或被另一个进程使用

问题描述

我试图找到以下问题的解决方案,但找不到任何好的解决方案。我有一个包含子文件夹和文件的文件夹。某些文件可能正在被另一个进程使用(另一个进程正在将数据写入数据(.mdf 文件))。

我只是想检查文件是否正在使用中。

结构:

A_Folder
  Setup
  Data1
    .mdf-file1
    .mdf-file2
  Data2
  Data3
  Evaluation

就像是:

def file_in_use():
    *your solution*

for file in folder:
    if file_in_use(file):
        print("file in use")
        break

我正在使用 Win10、PyCharm 和 venv。

到目前为止,我尝试了其他“解决方案”:

基本上我尝试了这个问题的所有内容:

检查文件是否未打开或未被其他进程使用

from subprocess import check_output, Popen, PIPE

src = r"C:\Data\S_t_h\S-t-h\H001.mdf"
files_in_use = False


def file_in_use(src):

    try:
        lsout = Popen(['lsof', src], stdout=PIPE, shell=False)
        check_output(["grep", src], stdin=lsout.stdout, shell=False)
    except:
        return False

return True


if file_in_use(src):
    files_in_use = True

我得到: FileNotFoundError: [WinError 2] 系统找不到指定的文件

此链接建议设置

winerror-2-the-system-cannot-find-the-file-specified-python

shell=True

我得到“lsof”和“grep”现在找不到或错了。

这里是适用于我的 psutil 方法,但速度太慢(~10 秒)

import psutil

src = r"C:\Data\S_t_h\S-t-h\H001.mdf"

def has_handle(src):
    for proc in psutil.process_iter():
        try:
            for item in proc.open_files():
                if src == item.path:
                    return True
        except Exception:
            pass

    return False


 print(has_handle(src))

我的解决方案:

很抱歉延迟回答。它只是与:

    try:
        os.rename(src, src)
        return False
    except OSError:    # file is in use
        return True

我把它弄得比我猜的要复杂。但无论如何,感谢你们的反馈和批评。

标签: pythonpython-3.xmdf

解决方案


推荐阅读