2009-07-06 7 views
0

ich den folgenden Code verwende, um zu bestimmen, ob ich in ein bestimmtes Verzeichnis mit QFileInfo schreiben:Falsche QFileInfo Berechtigungen für Benutzer-Desktop auf Vista 64

QFileInfo dinfo(dirname); 
if (dinfo.exists()) 
    valid = dinfo.isWritable() 

Leider, wenn ich in den Pfad des aktuellen Benutzers übergeben Desktop unter Vista 64:

QFileInfo :: isWritable() gibt false zurück. Wenn ich jedoch ein anderes Verzeichnis (zB C: \ Temp) übergebe, wird true zurückgegeben. Ich habe die Verzeichnisberechtigungen vom QFileInfo-Objekt angefordert, die 5555 waren (von niemandem beschreibbar). Dieser Code funktioniert wie erwartet auf anderen Plattformen einschließlich Windows XP. Jeder hat Ideen, was hier vor sich geht.

Als einen Bezugspunkt, wenn ich den Scheck entfernen kann ich die Datei tatsächlich an diesem Speicherort ohne ein Problem speichern.

Antwort

3

Also, nach ein bisschen durch den Task Tracker bei Qt, entdeckte ich, dass QFileInfo :: isWritable() ist nur gültig für die Verwendung von Dateien und nicht Verzeichnisse. Durch die Änderung des Codes zu fragen, ob ich die Datei von Interesse schaffen könnte, anstatt zu fragen, ob das Verzeichnis beschreibbar ist, konnte ich das gewünschte Ergebnis erzielen:

QDir dir(dirname); 
if (dir.exists()) 
{ 
    QFileInfo finfo(dir.absoluteFilePath(fname)); 
    valid = finfo.isWritable(); 
} 

Dank.

0

Ich mache eine sehr wilde Vermutung hier, aber haben Sie überprüft, ob es ein Link, eine Verknüpfung, ein Alias ​​oder ein anderer Pseudo-Ordner ist? Es scheint mir möglich zu sein, dass Sie die Berechtigungen eines hartkodierten Symlinks erhalten, der nicht beschreibbar ist, statt der Berechtigungen des Elements, auf das er verweist.

Von der isSymLink() Dokumentation (fett von mir hinzugefügt):

Unter Unix (einschließlich Mac OS X), einen Symlink Öffnung öffnet effektiv das Ziel der Verbindung. Unter Windows wird die .lnk-Datei selbst geöffnet.

So würde ich die Ergebnisse der isSymLink() überprüfen und ggf. das eigentliche Ziel von symLinkTarget() (und finden Sie in der Dokumentation für das letzte, das Ziel tatsächlich existieren kann oder auch nicht) erhalten.

0

Das Verzeichnis "C: \ Benutzer \ BENUTZERNAME \ Desktop" ist standardmäßig schreibgeschützt unter Windows Vista. Dies bedeutet nicht, dass Sie keine Dateien in den Ordner schreiben können. Dies bedeutet, dass Sie das Verzeichnis selbst nicht anpassen können (Namensänderung usw.).