2011-01-09 21 views
5

Estoy escribiendo un programa Qt (4.7 para Windows 7 inicialmente) que requiere escribir en el directorio instalado (C: \ Archivos de programa ...). No se crean archivos cuando intento escribir en una ubicación que estaría "protegida" (archivos de programa, C: \ etc). Sin embargo, QFile no me está dando ningún código de error (error() devuelve 0, lo que significa que funcionó bien).Qt no puede no puede crear/escribir en C:

Aquí hay un snippit de código que estoy usando y que no funciona. Estoy cerrando el archivo mucho más tarde en el programa.

QAplicación 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"); 

¿Alguien tiene alguna sugerencia sobre cómo solucionar este problema?

Gracias por la ayuda,

Jec


Adición de un archivo de manifiesto es la ruta elijo para solucionar este problema.

Gracias por toda la ayuda.

+2

"Sin embargo, QFile no me proporciona ningún código de error": Debe verificar el valor devuelto de debugFile.open(). –

Respuesta

7

¿Ha comprobado si el archivo no se creó en la Tienda Virtual para ese usuario? Compruebe el Visor de eventos en Registros de aplicaciones y servicios -> Microsoft -> Windows -> UacFileVirtualization -> Operational. Si ve entradas con el evento ID 5000, se ha producido un evento FileCreateVirtualExclude.

Compruebe si el archivo no se creó en %USERPROFILE%\AppData\Local\VirtualStore. Si así fuera, puede que tenga que incorporar un manifiesto solicitando los privilegios necesarios (es decir, convertir la virtualización fuera.)

Para más detalles, ver New UAC Technologies for Windows Vista (desplácese hacia abajo y busque la virtualización.)

+0

Tu estabas en lo cierto. Mis archivos estaban siendo almacenados en la tienda virtual (bueno, la mayoría de ellos de todos modos. Tenía una subcarpeta que no estaba siendo almacenada virtualmente por alguna razón). Agregué el manifiesto para que mi programa se esté ejecutando virtualmente. Gracias. – jecjackal

2

Necesita adquirir suficientes derechos de acceso de usuario (es decir, "Ejecutar como administrador") para escribir en dichas carpetas en Windows Vista +. Inicie la aplicación como administrador o solicite los derechos de administrador a través de una llamada a WinAPI.

+0

AFAIK no puede solicitar derechos de administrador para un proceso ya en ejecución, pero tiene que iniciar otro proceso para realizar las operaciones que requieren esos permisos. –

2

QFile puede estar dando tiene un código de error, pero no ha podido verificarlo.

Usted debe hacer algo más como:

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

Ha comprobado el valor de retorno de QFile::error, pero sólo antes de llamar open - es necesario comprobar después de la tentativa abierta.

+0

Guau, tenías razón. Estaba revisando el código de error antes de abrir el archivo. Bueno, eso es lo que sucede cuando me quedo hasta tarde codificando :). Gracias. – jecjackal

Cuestiones relacionadas