2013-08-06 117 views
4

有時我需要確保在保存一些數據時不會覆蓋現有文件,並且我想使用一個附加類似於瀏覽器的後綴的函數 - 如果dir/file.txt存在,它變成dir/file (1).txt爲文件名添加唯一後綴

回答

7

這是我做了一個實現,即使用Qt功能:

// Adds a unique suffix to a file name so no existing file has the same file 
// name. Can be used to avoid overwriting existing files. Works for both 
// files/directories, and both relative/absolute paths. The suffix is in the 
// form - "path/to/file.tar.gz", "path/to/file (1).tar.gz", 
// "path/to/file (2).tar.gz", etc. 
QString addUniqueSuffix(const QString &fileName) 
{ 
    // If the file doesn't exist return the same name. 
    if (!QFile::exists(fileName)) { 
     return fileName; 
    } 

    QFileInfo fileInfo(fileName); 
    QString ret; 

    // Split the file into 2 parts - dot+extension, and everything else. For 
    // example, "path/file.tar.gz" becomes "path/file"+".tar.gz", while 
    // "path/file" (note lack of extension) becomes "path/file"+"". 
    QString secondPart = fileInfo.completeSuffix(); 
    QString firstPart; 
    if (!secondPart.isEmpty()) { 
     secondPart = "." + secondPart; 
     firstPart = fileName.left(fileName.size() - secondPart.size()); 
    } else { 
     firstPart = fileName; 
    } 

    // Try with an ever-increasing number suffix, until we've reached a file 
    // that does not yet exist. 
    for (int ii = 1; ; ii++) { 
     // Construct the new file name by adding the unique number between the 
     // first and second part. 
     ret = QString("%1 (%2)%3").arg(firstPart).arg(ii).arg(secondPart); 
     // If no file exists with the new name, return it. 
     if (!QFile::exists(ret)) { 
      return ret; 
     } 
    } 
} 
+0

這種實現是不是原子,你應該使用QTemporaryFile – Jim

+0

此外,它不適用於像「.bashrc」(注意前導點)文件。 –

2

QTemporaryFile可以做到這一點對於非臨時文件,儘管它的名字:

QTemporaryFile file("./foobarXXXXXX.txt"); 
    file.open(); 
    // now the file should have been renamed to something like ./foobarQSlkDJ.txt 
    file.setAutoRemove(false); 
    // now the file will not be removed when QTemporaryFile is deleted 
相關問題