以编程方式覆盖现有文件
Overwrite an existing file programmatically
我有一个 QDialogBox,其中有一个上传文件的选项。
我可以上传文件并将它们保存到文件夹中。效果很好。
但是如果文件夹中已经存在一个文件,我不确定如何处理这种情况。
我想警告用户同名文件已经存在。
在这种情况下,我可以使用 Windows API 吗? (因为当我们手动保存现有文件时,我们会收到警告,我该如何使用它?)
如果有人可以指出该文档,那就太好了。
如果您不使用 QFileDialog,您可以使用 QDir::entryList()
获取目录中的文件名。
QDir dir("/path/to/directory");
QStringList fileNames = dir.entryList();
然后遍历文件名,看看是否有同名文件。如果你需要它,我也可以举一个例子。它是 C++,但很容易适应 Python。
编辑:Smasho 刚刚建议使用 QDir::exists() 方法。您可以使用此方法检查目录中是否存在文件名,而不是像我建议的那样进行迭代。
if(dir.exists(uploadedFileName))
如果您使用的是 QFileDialog,confirmOverwrite
默认激活,因此,如果 getSaveFileName()
返回一个非空的 QString,则意味着用户同意覆盖文件。否则,你会得到一个空的 QString。
然后,您可以检查该文件是否存在,并在这种情况下将其删除,但您知道用户对此表示满意。
保存文件时总是存在潜在的竞争条件。首先检查文件是否存在不安全,因为其他一些进程可能会在检查和实际写入文件之间创建同名文件。
为避免出现问题,文件必须以独占访问方式打开,并且如果文件已经存在,则打开方式会立即失败。
如果你想把事情做好,看看这两个答案:
我有一个 QDialogBox,其中有一个上传文件的选项。 我可以上传文件并将它们保存到文件夹中。效果很好。
但是如果文件夹中已经存在一个文件,我不确定如何处理这种情况。
我想警告用户同名文件已经存在。
在这种情况下,我可以使用 Windows API 吗? (因为当我们手动保存现有文件时,我们会收到警告,我该如何使用它?)
如果有人可以指出该文档,那就太好了。
如果您不使用 QFileDialog,您可以使用 QDir::entryList()
获取目录中的文件名。
QDir dir("/path/to/directory");
QStringList fileNames = dir.entryList();
然后遍历文件名,看看是否有同名文件。如果你需要它,我也可以举一个例子。它是 C++,但很容易适应 Python。
编辑:Smasho 刚刚建议使用 QDir::exists() 方法。您可以使用此方法检查目录中是否存在文件名,而不是像我建议的那样进行迭代。
if(dir.exists(uploadedFileName))
如果您使用的是 QFileDialog,confirmOverwrite
默认激活,因此,如果 getSaveFileName()
返回一个非空的 QString,则意味着用户同意覆盖文件。否则,你会得到一个空的 QString。
然后,您可以检查该文件是否存在,并在这种情况下将其删除,但您知道用户对此表示满意。
保存文件时总是存在潜在的竞争条件。首先检查文件是否存在不安全,因为其他一些进程可能会在检查和实际写入文件之间创建同名文件。
为避免出现问题,文件必须以独占访问方式打开,并且如果文件已经存在,则打开方式会立即失败。
如果你想把事情做好,看看这两个答案: