2011-01-09 22 views
5

Sto scrivendo un programma Qt (inizialmente per Windows 7 4.7) che richiede la scrittura nella directory installata (C: \ Programmi ...). Nessun file viene creato quando provo a scrivere in un percorso che sarebbe "protetto" (file di programma, C: \ etc). Tuttavia, QFile non mi sta fornendo alcun codice di errore (error() restituisce 0, il che significa che ha funzionato correttamente).Qt can not non può creare/scrivere in C:

Ecco uno snippit di codice che sto utilizzando che non funziona. Sto chiudendo il file proprio più tardi nel programma.

QApplicazione 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"); 

Qualcuno ha qualche consiglio su come risolvere questo problema?

Grazie per l'aiuto,

Jec


Aggiunta di un file manifesto è il percorso che ho scelto di risolvere questo problema.

Grazie per tutto l'aiuto.

+2

"Tuttavia, QFile non mi sta fornendo alcun codice di errore": È necessario verificare il valore restituito da debugFile.open(). –

risposta

7

Hai controllato se il file non è stato creato nel VirtualStore per quell'utente? Controlla il Visualizzatore eventi in Registri applicazioni e servizi -> Microsoft -> Windows -> UacFileVirtualization -> Operational. Se vengono visualizzate voci con ID evento 5000, si è verificato un evento FileCreateVirtualExclude.

Verificare se il file non è stato creato in %USERPROFILE%\AppData\Local\VirtualStore. Se così fosse, potrebbe essere necessario incorporare un manifesto che richiede i privilegi necessari (ad esempio, trasformando la virtualizzazione off.)

Per maggiori dettagli, vedere New UAC Technologies for Windows Vista (scorrere verso il basso e cercare di virtualizzazione.)

+0

Eri assolutamente corretto. I miei file venivano archiviati nell'archivio virtuale (beh la maggior parte di essi comunque. Avevo una sottocartella che non veniva archiviata virtualmente per qualche motivo). Ho aggiunto il manifest così il mio programma ora funziona virtualmente. Grazie. – jecjackal

2

È necessario acquisire diritti di accesso utente sufficienti (ad esempio "Esegui come amministratore") per scrivere in tali cartelle in Windows Vista +. Avvia l'app come amministratore o chiedi i diritti di amministratore tramite una chiamata a WinAPI.

+0

AFAIK non è possibile richiedere diritti di amministratore per un processo già in esecuzione ma è necessario avviare un altro processo per eseguire le operazioni che richiedono tali autorizzazioni. –

2

qfile può dare hai un codice di errore, ma non sei riuscito a verificarlo.

Si dovrebbe fare qualcosa di più simile a:

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

Hai controllato il valore di ritorno di QFile::error, ma solo prima chiamare open - è necessario controllare dopo il tentativo aperto.

+0

Wow, avevi ragione. Stavo controllando il codice di errore prima di aprire il file. Bene, questo è quello che succede quando sto facendo tardi a programmare :). Grazie. – jecjackal