4
有時我需要確保在保存一些數據時不會覆蓋現有文件,並且我想使用一個附加類似於瀏覽器的後綴的函數 - 如果dir/file.txt
存在,它變成dir/file (1).txt
。爲文件名添加唯一後綴
有時我需要確保在保存一些數據時不會覆蓋現有文件,並且我想使用一個附加類似於瀏覽器的後綴的函數 - 如果dir/file.txt
存在,它變成dir/file (1).txt
。爲文件名添加唯一後綴
這是我做了一個實現,即使用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;
}
}
}
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
這種實現是不是原子,你應該使用QTemporaryFile – Jim
此外,它不適用於像「.bashrc」(注意前導點)文件。 –