Abfrage Schreibrechte in einem Ordner...

Alles rund um die Programmierung mit Qt
Antworten
RobRoy1304
Beiträge: 47
Registriert: 9. Juli 2009 10:56

Abfrage Schreibrechte in einem Ordner...

Beitrag von RobRoy1304 »

Hallo,

in dem Programm an das ich gerade arbeite gibt es eine Funktion um eine Sicherung zu erstellen. Ich rufe dort eine QFileDialog auf mit dessen Hilfe der user den Pfad wählen kann an dem die Sicherung erstellt werden soll. Eine Kopie der DB-Datei aus dem Programmordner wird dann an dem gewählten Pfad erstellt.
Mein Problem ist jetzt, das ich vorher abfragen möchte ob der user die nötigen Schreibrechte für diesen Pfad hat.
Unter Linux funktioniert das mit Hile von QFileInfo::permission(QFile::WriteUser) bestens, aber unter Windows leider nicht. Dort gibt er mir immer true zurück, egal ob ich QFile::ReadUser bis QFile::ExeOther übergebe.

Gibt es eine andere Möglichkeit die Schreibrechte für einen Ordner unter Windows abzufragen???

Code: Alles auswählen

QFile file(QString("lava.sqlite"));
    QString sFile=QFileDialog::getSaveFileName(this,QString("Sicherung erstellen"),sName);
    QStringList ls;

    if(sFile.length()>0)//file dialog finish with 'save'?
    {
        //file info (permission)
        ls=sFile.split("/");
        for(int i=0;i<ls.count()-1;i++)
            s+=ls[i]+QString("/");
        file_info.setFile(s);//nur der Pfad wird gesetzt
        if(!file_info.permission(QFile::WriteUser))//funktioniert nur unter linux
        {
            msg.setText(QString("Sie haben keine Schreibrechte an diesem Ort!"));
            msg.exec();
        }
        else
        {
            //check give it file?
            QFile file2(sFile);
            if(file.open(QIODevice::ReadOnly))
                bFileExis=true;
            file2.close();
            if(bFileExis)
                QFile::remove(sFile);//delete old file

            //copy
            if(!file.copy(sFile))
            {
                s=QString("Fehler beim Erstellen der Sicherung\n%1").arg(file.errorString());
                s+=QString(" / errorcode: %1").arg(file.error());
                msg.setText(s);
                msg.exec();
            }
        }
    }
    file.close();
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

In der Doku steht nichts von Windows, sondern nur
On systems where files do not have permissions this function always returns true.
Keine FS-Permissions -> kein Problem. Oder hast du Probleme? Kannst du auf das FS nicht schreibend zugreifen, obwohl QFileInfo::isWritable() true zurück gibt?

BTW.:
Objekte immer so lokal wie möglich halten. Dein file_info ist wohl ein Member der Klasse, obwohl er nur in der Funktion gebraucht wird. Ein QFileInfo-Objekt ist schnell konstruiert (performance-mäßig). Wenn es noch wo anders wissen willst, wo das Backup gespeichert wird (was ich nicht denk), kannst du dir einfach den QString vom QFileDialog speichern.
RobRoy1304
Beiträge: 47
Registriert: 9. Juli 2009 10:56

Beitrag von RobRoy1304 »

file_info ist lokal, geht aus dem code-Schnipsel nicht hervor, sry.
Das Problem ist nur, wenn der user ein backup z.B. unter /windows/system32/ erstellen möchte, was natürlich nicht geht, gibt es keine Fehlermeldung.

Der user soll aber darüber informiert werden das die Aktion fehlgeschlagenen ist, nicht das er fälschlicherweise annimmt, ich habe ja noch ein backup.

Das mit QFile::IsWritable schau ich mir nochmal an, vielen Dank ersteinmal an dich für deine Antwort.
Antworten