Hallo,
ich möchte gerne eine Datei erstellen die ein festes Prefix und ein festes Suffix hat. Dazwischen ist Platz für einen Identifier. Wie der Titel schon sagt soll der Dateiname unique werden. Und im Gegensatz zu QTemporaryFile auch permanent bleiben. Ich habe eine dafür geeignete Funktion in QT leider nicht gefunden. Gibt es die wirklich nicht oder sollte ich minen Optiker/Augenarzt wieder konsultieren? Und wenn dem so ist: wie heißt die Funktion?
Danke und Grüße,
Willi
Unique Filename
Klar muss ein Dateiname einzeln sein. Ich dachte das eher so in der Richtung das die Funktion in der Art aufgerufen wird:
und dann in dem Directory "dir" eine neue Datei erzeugt mit Prefix "prefix" und Suffix "suffix". Wenn die Funktion mehrfach aufgerufen wird wird dann halt zwischen Prefix und Suffix ein Wert gesetzt.
Aber Deine Antwort impliziert das es das wohl nicht gibt.
Danke.
Code: Alles auswählen
QString getUniqueFileName(dir, prefix, suffix)Aber Deine Antwort impliziert das es das wohl nicht gibt.
Danke.
QUuid
Mit einer UUID kannst Du einen eindeutigen Identifier "machen". Das folgende Codebeispiel habe ich zusammengewürfelt.
Code: Alles auswählen
QUuid uuid = QUuid::createUuid() );
QString str = uuid.toString();
// 01234567890123456789012345678901234567
// 12345678 1234 1234 1234 123456789012
// {0069e0d9-528b-41d6-91d1-169e6f0de6e2}
str = str.mid( 1, 8 ) + str.mid( 10, 4 ) + str.mid( 15, 4 ) + str.mid( 20, 4 ) + str.mid( 25, 12 );
Q_ASSERT( str.length() == 32 );
Code: Alles auswählen
#include <QtGlobal>
#include <QString>
#include <QSet>
#include <algorithm>
QString gimmeUniqueName()
{
// ressource for the name
static QString all ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890______");
// already given names for the unlikely case that ... yeah well ...
static QSet<QString> used;
// mix it
while (used.contains(all)) {
std::random_shuffle(all.begin(),all.end());
}
used.insert(all);
return all;
}
int main(int argc, char *argv[])
{
qsrand(QTime(0,0,0,0).msecsTo(QTime::currentTime()));
QString uniqueName = gimmeUniqueName() ;
}So ? Sind aber lange Namen