2015-02-06 32 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