Unique Filename

Alles rund um die Programmierung mit Qt
Antworten
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Unique Filename

Beitrag von Willi2793 »

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
Oxymoron
Beiträge: 6
Registriert: 10. Juni 2010 20:04

Beitrag von Oxymoron »

Ein Dateiname muss doch eh einzigartig sein? Oder willst du, dass dein Programm nie wieder eine Datei gleichen Namens erzeugt?
Wenn du nur irgendeinen zufälligen Namen brauchst: Zufallszahl, Hashfunktion darüber laufen lassen, dann kurz prüfen ob es eine gleichnamige Datei schon gibt - fertig.
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag von Willi2793 »

Klar muss ein Dateiname einzeln sein. Ich dachte das eher so in der Richtung das die Funktion in der Art aufgerufen wird:

Code: Alles auswählen

QString getUniqueFileName(dir, prefix, suffix)
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.
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

QUuid

Beitrag von odt »

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 );
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag von padreigh »

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 :D
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag von Willi2793 »

Vielen Dank :)
Antworten