2011-01-09 8 views
5

Ich schreibe ein Qt-Programm (4.7 für Windows 7 zunächst), die Schreiben in das installierte Verzeichnis (C: \ Programme ...) erfordert. Es werden keine Dateien erstellt, wenn ich versuche, an einen Speicherort zu schreiben, der "geschützt" wäre (Programmdateien, C: \ etc). QFile gibt mir jedoch keinen Fehlercode (error() gibt 0 zurück, was bedeutet, dass es fehlerfrei funktioniert).Qt kann nicht erstellen/schreiben zu C:

Hier ist ein Code-Snippit, den ich benutze, der nicht funktioniert. Ich schließe die Datei erst viel später im Programm.

QApplication a (argc, argv);

// Setting plugin paths. 
QStringList paths = QCoreApplication::libraryPaths(); 
paths.append(QCoreApplication::applicationDirPath()); 
QCoreApplication::setLibraryPaths(paths); 



// Debug file. 
QString path = QCoreApplication::applicationDirPath() + "/debug.dat"; 
//QFile debugFile(QCoreApplication::applicationDirPath() + "/debug.dat"); 
QFile debugFile("C:/debug.txt"); 
qDebug() << debugFile.error(); 
debugFile.setPermissions(QFile::WriteUser | QFile::WriteGroup | QFile::WriteOwner | QFile::WriteOther); 
debugFile.open(QFile::WriteOnly); 
QTextStream debugStream(&debugFile); 

// Processing the arguments. 
debugStream << QString("Processing Arguments\n"); 

Hat jemand irgendwelche Tipps, wie dieses Problem zu lösen?

Danke für die Hilfe,

Jec


eine Manifest-Datei hinzufügen ist der Weg, den ich wählen, um dieses Problem zu beheben.

Vielen Dank für die Hilfe.

+2

"QFile gibt mir jedoch keinen Fehlercode": Sie sollten den Rückgabewert von debugFile.open() überprüfen. –

Antwort

7

Haben Sie überprüft, ob die Datei im VirtualStore für diesen Benutzer erstellt wurde? Überprüfen Sie die Ereignisanzeige unter Anwendungs- und Dienstprotokolle -> Microsoft -> Windows -> UacFileVirtualization -> Operational. Wenn Einträge mit Ereignis-ID 5000 angezeigt werden, ist ein FileCreateVirtualExclude-Ereignis aufgetreten.

Überprüfen Sie, ob die Datei unter %USERPROFILE%\AppData\Local\VirtualStore erstellt wurde. Wenn ja, müssen Sie ein Manifest einbetten die erforderlichen Berechtigungen anfordert (dh Drehen Virtualisierung aus.)

Weitere Einzelheiten finden Sie New UAC Technologies for Windows Vista (nach unten scrollen und suchen Virtualisierung.)

+0

Sie waren absolut richtig. Meine Dateien wurden im virtuellen Speicher gespeichert (die meisten von ihnen sowieso. Ich hatte einen Unterordner, der aus irgendeinem Grund nicht virtuell gespeichert wurde). Ich habe das Manifest hinzugefügt, so dass mein Programm jetzt virtuell läuft. Vielen Dank. – jecjackal

2

Sie müssen ausreichende Benutzerzugriffsrechte (dh "Als Administrator ausführen") erwerben, um in Windows Vista + in solche Ordner zu schreiben. Entweder starten Sie die App als Administrator oder fragen Sie über einen Aufruf von WinAPI nach Administratorrechten.

+0

AFAIK Sie können keine Administratorrechte für einen bereits laufenden Prozess anfordern, müssen jedoch einen anderen Prozess starten, um die Vorgänge auszuführen, für die diese Berechtigungen erforderlich sind. –

2

QFile geben können Sie haben einen Fehlercode, aber Sie haben es versäumt, danach zu suchen.

Sie sollen etwas mehr wie tun:

if (!debugFile.open(QFile::WriteOnly)) { 
    qWarning() << "Failed to open" << debugFile.fileName() << "for write:" << debugFile.errorString(); 
} 

Sie den Rückgabewert von QFile::error geprüft hat, aber nur vor Aufruf open - Sie brauchen nach der offenen Versuch zu überprüfen.

+0

Wow, du hattest Recht. Ich habe den Fehlercode vor dem Öffnen der Datei überprüft. Nun, das ist, was passiert, wenn ich spät dran bin Codierung :). Vielen Dank. – jecjackal