Seite 1 von 1

Abfrage Schreibrechte in einem Ordner...

Verfasst: 1. Mai 2011 16:48
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();

Verfasst: 1. Mai 2011 18:56
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.

Verfasst: 1. Mai 2011 19:54
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.