Add a unique suffix to the file name

Sometimes I need to make sure that I don’t overwrite the existing file while saving some data, and I would like to use a function that adds a suffix similar to what the browser does - if dir/file.txt exists, it becomes dir/file (1).txt .

+4
source share
2 answers

This is an implementation I made that uses Qt functions:

 // 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; } } } 
+7
source

QTemporaryFile can do this for non-temporary files, despite its name:

  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 
+2
source

Source: https://habr.com/ru/post/1495457/