2011-01-19 21 views
5

estoy tratando de abrir un archivo XML en la ubicación actual del ejecutableQt cómo abrir un archivo en el directorio actual? o qué pasa con esto?

 QString path = QDir::currentPath(); 
     path.append("/acc.xml"); 
     QFile file(path); 

     if(!file.open(QIODevice::ReadOnly)) 
     { 
      insertItem("IO ERR"); 
     } 
  • Cuando lo ejecuto desde Qt Creator, todo funciona. currentPath() devuelve la ruta a la carpeta del ejecutable

  • Cuando voy a project-build-desktop/ carpeta y trato de ejecutar manualmente currentPath() vuelve /home/user/Documents

EDIT

también trató con el mismo resultado:

Qt::current().path(); 
Qt::current().absolutePath(); 
+1

El problema obviamente proviene de la ruta del documento. –

+0

¿Cuál es la forma correcta? Ya he pasado casi 2 horas tratando de entender Qt – sdadffdfd

Respuesta

2

Chec k el valor devuelto de QDir::currentPath(). Creo que cuando ejecutas Qt Creator, devuelve la ruta donde se encuentra el archivo de proyecto (* .pro). Cuando corres desde afuera, obtienes la ruta del binario.

Editar

Nunca he trabajado con Linux. Sin embargo, puede probar otras funciones/combinaciones de QDir:.

  • QDir :: current() ruta()
  • QDir :: current() rutaAbsoluta()

etc.

.
+0

desde fuera '/ home/user/Documents'. Pero el ejecutable que estoy ejecutando claramente no está allí ... – sdadffdfd

+0

Realmente necesito el camino al binario ... y eso no está sucediendo cuando lo ejecuto desde afuera – sdadffdfd

+0

@Vic .: Por favor revisa la edición. – Donotalo

2

Para abrir un archivo en el directorio actual, sólo tiene que llamar QFile constructor

he probado esto en mi máquina Linux y funciona

#include <QtCore> 

int main(int argc, char** argv){ 
    QFile some_file("test.xml"); 
    if(!some_file.open(QIODevice::ReadOnly | QIODevice::Text)){ 
     qDebug() << "Unable to open file"; 
    } else { 
     qDebug() << "File open successfully"; 
    } 
    exit(-1); 
} 

Ejecuto ./TestQFile y si hay un test.xml en el directorio actual, funciona.

ACTUALIZACIÓN: Me he dado cuenta de que el texto de su pregunta dice que desea que el archivo en el mismo directorio que el ejecutable, esto se puede hacer de la siguiente manera:

// Getting directory of the executable 
QFileInfo exec_fileinfo(argv[0]); 
qDebug() << "Executable is in" << exec_fileinfo.absolutePath(); 

ACTUALIZACIÓN 2: Bajo el panel del proyecto de QtCreator, hay un campo para Working Directory. Este es el directorio que devuelve QDir :: currentPath() si lo está ejecutando a través de QtCreator.

+0

No usé QtCreator para codificar esto. ¿Puede dar más detalles sobre la estructura de su directorio y el comando exacto que ejecutó para reproducir el error de abrir archivo? –

+0

Parece que QtCreator hace algún tipo de 'magia' al ejecutar mi proyecto. Es una aplicación GUI que intento diseñar. Desde 'afuera 'suelo ejecutar la aplicación sin argumentos, solo' clic ' – sdadffdfd

+0

Probé para ver cómo QtCreator lo ejecuta .. sólo encontrado:' Inicio/inicio/usuario/Proyectos/Proyecto-compilación-escritorio/Proyecto ... ' – sdadffdfd

1

yo encontramos este debate, mientras que la búsqueda de una solución similar. Creo que la forma más portátil de abrir un archivo externo que tiene un nombre fijo (y no hay diálogos y el usuario está involucrado) es usar el Resource System.

En mi caso, creé un nuevo archivo de recursos con el prefijo /config y agregué el archivo (llamado settings.xml). Dentro del código, no necesito usar ninguna función de ruta en absoluto. Yo uso el sistema de recursos en su lugar. Por lo tanto, una llamada como QFile file(":/config/settings.xml") funciona bien. Usando QT creator 2.0.1 y QT 4.7 en Windows.

+0

Para comentarme, esta solución funciona pero tiene la desventaja de no poder modificar el archivo XML ya que se convierte en un archivo de recursos binarios. Si necesita poder modificar los contenidos XML y ejecutar la aplicación sin volver a compilar, use una de las soluciones restantes proporcionadas aquí. – ierax

Cuestiones relacionadas