在操作前检查文件是否已打开

1 投票
1 回答
2809 浏览
提问于 2025-04-18 04:06

我写了一个脚本,用来根据特定条件给文件夹里的文件重命名。

    if len(self.toLoc.get()) == 0:
        searchRev = "_R" + newRev
        for filename in os.listdir(App.pdfDir):
            try:
                filePath, fileExtension = os.path.splitext(filename)
                sep = searchesri
                rest = filename.split(sep, 1)[0] + searchRev + fromLocation + fileExtension
                if fileExtension == '.pdf':
                    shutil.move(os.path.join(App.pdfDir, filename), os.path.join(App.pdfDir, rest))
                elif fileExtension == '.xlsx':
                    shutil.move(os.path.join(App.pdfDir, filename), os.path.join(App.pdfDir, rest))
            except IOError:
                print ("Errror")

我想用“try”和“except”来检查文件是否打开,然后再进行重命名。目前,如果文件是打开的,程序会显示“错误”信息,并且重命名文件,但会在目录里保留一个原文件的副本。我希望能在开始重命名之前,检查一下有没有文件是打开的?谢谢大家的建议。

1 个回答

1

编辑: 可能是重复的问题

你可以先尝试用 open 来打开文件,如果文件正在被使用,这个操作会抛出一个 IOException 错误。

if len(self.toLoc.get()) == 0:
searchRev = "_R" + newRev
for filename in os.listdir(App.pdfDir):
    FilePath, fileExtension = os.path.splitext(filename)
    try:
        with open(os.path.join(App.pdfDir, filename),"r+") as f:
             pass
    except IOError:
        print ("Errror")
    sep = searchesri
    rest = filename.split(sep, 1)[0] + searchRev + fromLocation + fileExtension
    if fileExtension == '.pdf':
        shutil.move(os.path.join(App.pdfDir, filename), os.path.join(App.pdfDir, rest))
    elif fileExtension == '.xlsx':
         shutil.move(os.path.join(App.pdfDir, filename), os.path.join(App.pdfDir, rest))

至于在检查之后和处理过程中确保文件没有被打开,shutil.move 是原子操作(基本上在使用时会锁定访问),当在同一个文件系统上时

撰写回答