2015-02-06 48 views
0

我有一个QDialogBox,其中有一个选项可用于上载文件。 我可以上传文件并将其保存到文件夹。它工作正常。以编程方式覆盖现有文件

但是,如果万一文件夹中已存在文件,我不知道如何处理该情况。

我想警告用户该文件具有相同的名称已经存在。

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

如果有人能指出我的文档,它会很棒。

回答

1

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

为避免出现问题,必须以独占访问方式打开该文件,并以这种方式立即失败(如果该文件已存在)。

如果你想要做正确的事情,看看这两个答案:

+0

谢谢。我可以使用文本文件。但有什么不同的方式来处理丰富的文本文件?我有一个单词文件,它被这种方式弄坏了。 – Ejaz 2015-02-07 16:04:49

+0

@PEJK。您可能需要以二进制模式写入文件:即'os.fdopen(fd,“wb”)'。 – ekhumoro 2015-02-07 18:53:03

0

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

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

然后通过文件名进行迭代,你可以看到,如果有相同名称的文件。如果你需要它,我也可以举一个例子。它会是C++,但很容易适应Python。

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

if(dir.exists(uploadedFileName)) 
+0

不需要迭代,一个QDir有exists()方法 – Smasho 2015-02-06 20:06:24

+0

@Smasho这是对的,但不是它检查“dir”是否存在? – 2015-02-06 20:07:22

+1

它既有,exists()没有参数,也有字符串参数[http://qt-project.org/doc/qt-4.8/qdir.html#exists]。有了一个参数,它指** **里面的文件** dir – Smasho 2015-02-06 20:08:45

2

如果您使用的是QFileDialogconfirmOverwrite被默认激活,所以,如果getSaveFileName()返回一个非空的QString,则意味着接受了覆盖该文件的用户。其他方式,你会得到一个空的QString。 然后,您可以检查文件是否存在,并在此情况下将其删除,但您知道用户对此正确。

+0

你可以按照@purplehuman的说法或Python的方式检查文件:'import os; os.path.exists(filename)' – Smasho 2015-02-06 20:40:26