首页 > 编程问答 >如果 Python 脚本正在使用文件夹,如何在文件资源管理器中进行更改时防止 Windows 的“文件夹正在使用”警告?

如果 Python 脚本正在使用文件夹,如何在文件资源管理器中进行更改时防止 Windows 的“文件夹正在使用”警告?

时间:2024-07-24 04:12:46浏览次数:14  
标签:python windows qt pyqt explorer

我有一个简单的 脚本 ,显示在QTreeView中的QListView中选择的目录的内容,我想添加打开文件资源管理器的功能,以让用户编辑目录内的内容。

但是,添加新的文件夹和文件可以,但删除或移动文件夹或文件会提示“文件夹正在使用”错误:

此操作无法完成,因为该文件已在另一个程序中打开

即使使用管理员权限,文件仍然被锁定,直到脚本关闭。

有没有办法让 Windows 在 Python 脚本运行时覆盖它?

import os
import sys

import PyQt5
from PyQt5 import QtWidgets, QtCore, uic, QtGui
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileSystemModel
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtCore import QFileSystemWatcher

class ImageViewer(QMainWindow):
    def __init__(self):
        super(ImageViewer, self).__init__()
        uic.loadUi(("test.ui"),self)
    
        username = "[USERNAME]"
        self.folder = f"C:/users/{username}/Documents/Project"

        #List
        self.listmodel = QStandardItemModel()
        self.listView.setModel(self.listmodel)
        self.listView.selectionModel().selectionChanged.connect(self.loadTree) #show content of the selected folder

        #Refresh list if there are any changes
        self.watcher = QFileSystemWatcher([self.folder])
        self.watcher.directoryChanged.connect(self.loadList)
        self.watcher.fileChanged.connect(self.loadList)

        #Tree
        self.treeModel = QFileSystemModel()
        self.treeModel.setRootPath(None)
        self.treeViewDirectory.setModel(None)
    
        #Open Explorer Button
        self.pushButton_explorer.clicked.connect(self.explorer)
    
        self.show()
        self.loadList()

    def loadList(self):
        self.listmodel.clear()
        for i in os.listdir(self.folder):
            item = QtGui.QStandardItem(i)
            self.listmodel.appendRow(item)
    
    def loadTree(self):
        selected = self.listView.selectedIndexes()[0].data()
        path = self.folder + "/" + selected
        self.treeViewDirectory.setModel(self.treeModel)
        self.treeViewDirectory.setRootIndex(self.treeModel.index(path))

    def explorer(self):
        os.startfile(self.folder)

def main():
    app = QApplication(sys.argv)
    window = ImageViewer()
    app.exec_()

if __name__ =="__main__":
    main()

问题在于 Python 脚本在默认情况下打开目录以进行读取和写入访问。若要允许其他程序修改目录内容,需要以只读模式打开目录。

这对的脚本没有必要,因为 QFileSystemModel QFileSystemWatcher 不需要写入访问权限即可监视和显示目录内容。

可以通过以下方式更改脚本:

  1. 不要在脚本中保留对目录的打开句柄。 目前,的脚本没有打开任何显式文件句柄,但它可能以某种方式访问目录。
  2. 使用 os.scandir 代替 os.listdir os.scandir 返回一个迭代器,该迭代器生成表示目录条目的 os.DirEntry 对象,并且比 os.listdir 更有效。
  3. 在调用 explorer 函数后,考虑使用 time.sleep 添加一个短暂的延迟。 这可以让文件资源管理器完全初始化目录视图,然后再进行任何更改。

以下是更新后的 loadList 函数:

    def loadList(self):
        self.listmodel.clear()
        for entry in os.scandir(self.folder):
            if entry.is_dir():
                item = QtGui.QStandardItem(entry.name)
                self.listmodel.appendRow(item)

    def explorer(self):
        os.startfile(self.folder)
        time.sleep(0.5)  # 添加一个短暂的延迟

通过这些更改,应该能够在 Python 脚本运行时在文件资源管理器中自由地修改目录内容,而不会遇到“文件夹正在使用”警告。

标签:python,windows,qt,pyqt,explorer
From: 78785018

相关文章

  • 如何使用 Python API 获取每个模型的活跃用户列表、最后登录信息
    我想通过PythonAPI获取我的dbt项目的所有模型中的活动或非活动用户列表。这可能吗?我尝试列出模型,但无法获取用户信息,如用户名、项目、以及上次活动或上次登录。不幸的是,dbt本身并不跟踪你所寻找的用户活动数据(最后登录、活跃用户等)。dbt的主要功能是转换数据,而不......
  • Python tkinter 窗口不断关闭,我不知道为什么
    我正在尝试制作一个有趣的小程序,其中每小时左右就会有一只毛茸茸的动物走过屏幕。我有一个主窗口,它启动一个循环,每小时左右播放一次动画/声音,但是在口袋妖怪第一次完成行走后,整个程序就会结束。我认为这可能与我设置tkinter窗口的方式有关,但我无法弄清楚。我认为在这里包含......
  • 用于自动访问 MongoDB Atlas CLI 的 Python 脚本
    我想编写一个Python脚本,以便普通用户可以访问他的数据库并从他的终端执行CRUD操作。我正在查看官方文档,但我有点迷失。有人可以给我指点基本教程来开始吗?当然,以下是如何构建Python脚本来访问MongoDBAtlasCLI的基本教程:先决条件:MongoDBAtlas......
  • Python实现简单学生登陆系统
     代码:importhashlibclassStudent:def__init__(self,username,password):#初始化学生对象,存储用户名和加密后的密码self.username=usernameself.password=hashlib.sha256(password.encode()).hexdigest()defcheck_passwo......
  • python猜数字游戏
    好的,下面是一个简单的小游戏代码示例,使用Python编写。这个游戏是一个猜数字游戏,玩家需要猜一个1到100之间的随机数。importrandomdefguess_number_game():print("欢迎来到猜数字游戏!")print("我已经想好了一个1到100之间的数字,请你猜一猜。")secret_num......
  • 【Python正则表达式】:文本解析与模式匹配
    文章目录1.正则表达式2.re模块3.修饰符3.元字符3-1字符匹配元字符3-2重复次数限定元字符3-3字符集合匹配元字符3-4分组元字符3-5边界匹配元字符3-6字符类别匹配元字符4.技巧4-1贪婪与非贪婪5.案例1.正则表达式正则表达式面向什么样的问题?1、判断一个字......
  • 仅需增加2行代码,Python量化策略速度提升20+倍!
    今天分享一个Python量化策略加速的小技巧,不用修改原有代码,只需在原有代码里新增2行,策略执行速度便可能提高20+倍,正文开始~现如今,无论是入门量化投资,还是做数据分析、机器学习和深度学习,Python成为了首选编程语言,直观的原因就是容易上手和资源丰富,但Python有个根深蒂固的标签,......
  • windows10安装过程,win7升级win10过程
    教程是win7老系统升级win101、空的u盘和一台windown操作系统的电脑准备一个u盘,提前备份盘内数据,因为制作启动盘会将u盘格式化需要一台能联网的windows操作系统的电脑用于制作系统安装盘2、浏览器搜索“下载win10安装包”也可直接点击链接 下载Windows10 3、下载之......
  • Python基础-Anaconda,Spyder,数据类型
    1、Python与Anaconda在想使用Python之前需先安装Python,以及PythonIDE和Python的库,而用Anaconda就可以一键安装。Anaconda包含了Python,常用的python库以及IDE,还具有强大的环境和python包的管理能力。PythonIDE(IntegratedDevelopmentEnvironment,集成开发环境)是一个为开发......
  • python实现图像特征提取算法2
    python实现广义Hough变换算法、Hough变换算法1.广义Hough变换算法详解算法步骤Python实现详细解释优缺点2.Hough变换算法详解算法步骤Python实现详细解释优缺点实现广义Hough变换算法(GeneralizedHoughTransform)可以用于检测任意形状的......