【问题标题】:Overwrite an existing file programmatically以编程方式覆盖现有文件
【发布时间】:2015-04-07 01:32:24
【问题描述】:

我有一个 QDialogBox,其中有一个上传文件的选项。 我可以上传文件并将它们保存到文件夹中。它工作正常。

但是如果文件夹中已经存在文件,我不确定如何处理这种情况。

我想警告用户同名文件已经存在。

在这种情况下我可以使用 Windows API 吗? (因为当我们手动保存现有文件时,会收到警告,我该如何使用?)

如果有人可以向我指出该文档,那就太好了。

【问题讨论】:

    标签: qt pyqt


    【解决方案1】:

    如果您使用的是QFileDialog,默认情况下会激活confirmOverwrite,因此,如果getSaveFileName() 返回非空QString,则表示用户接受覆盖文件。否则,你会得到一个空的 QString。 然后,您可以检查文件是否存在,并在这种情况下将其删除,但您知道用户对此表示满意。

    【讨论】:

    • 你可以像@purplehuman说的那样检查文件,或者python的方式:import os; os.path.exists(filename)
    【解决方案2】:

    保存文件时总是存在潜在的竞争条件。首先检查文件是否存在不安全,因为其他进程可能会在检查和实际写入文件之间创建同名文件。

    为避免出现问题,文件必须以独占访问权限打开,并且如果文件已经存在,则立即失败。

    如果你想把事情做好,看看这两个答案:

    【讨论】:

    • 谢谢。我可以处理文本文件。但是有没有不同的方式来处理富文本文件?我有一个 word 文档,它会这样损坏。
    • @PEJK。您可能需要以二进制模式写入文件:即os.fdopen(fd, "wb")
    【解决方案3】:

    如果您不使用 QFileDialog,您可以使用QDir::entryList() 获取目录中的文件名。

     QDir dir("/path/to/directory");
     QStringList fileNames = dir.entryList();
    

    然后遍历文件名,可以查看是否有同名文件。如果你需要它,我也可以举个例子。它是 C++,但很容易适应 Python。

    编辑:Smasho 只是建议使用 QDir::exists() 方法。您可以使用此方法检查目录中是否存在文件名,而不是像我建议的那样进行迭代。

     if(dir.exists(uploadedFileName))
    

    【讨论】:

    • 不需要迭代,QDir有exists()方法
    • @Smasho 没错,但不是检查“dir”是否存在吗?
    • 两者都有,exists() 不带参数,带字符串参数 [qt-project.org/doc/qt-4.8/qdir.html#exists].有一个参数,它指的是一个文件inside那个dir
    • @Smasho 谢谢你的信息。更新了答案。我正在使用 exists() 方法,但我不知道还有另一个带有 QString 参数的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 2014-12-10
    • 1970-01-01
    • 2012-02-27
    • 2018-08-26
    • 1970-01-01
    相关资源
    最近更新 更多