Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: kerkox en 15 Abril 2014, 17:17 pm



Título: Como utilizar fstream para archivos con rutas dinamicas
Publicado por: kerkox en 15 Abril 2014, 17:17 pm
Hola a todos, tengo un problema con una funcion de fstream pues el problema es que para poder abrir un fichero debo de tener la ruta completa, pero yo quiero hacerla dinamica ya que se que se puede utilizar el %windir% para llegar a la letra del disco principal y la carpeta windows
Ejemplo.

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <fstream>
  4.  
  5.  
  6. using namespace std;
  7.  
  8. bool file_exists(const char * f)
  9. {
  10.    ifstream file;
  11.    file.open(f);
  12.    if(file.fail())
  13.        return false;
  14.    file.close();
  15.    return true;
  16. }
  17.  
  18. int main()
  19. {
  20.  
  21. cout << "Vamos a ver si es fichero existe  " <<endl;
  22. cout << endl;
  23. cin.get();
  24.  
  25. //con esta no funciona
  26. bool j = file_exists("%windir%\system32\cmd.exe"); // se puede usar file.exe pues para verficar
  27. /*
  28. Peo con esta si funciona
  29. bool j = file_exists("c:\\windows\\system32\\cmd.exe");
  30. */
  31.  
  32.  
  33. if (j)
  34. {
  35.  
  36. cout << "si existe el archivo  "<< endl;
  37. cin.get();
  38.  
  39. }
  40. else
  41. {
  42.    cout << "No existe el archivo" << endl;
  43.    cin.get();
  44. }
  45.  
  46. return 0;
  47.  
  48.  
  49. }

Pues desearia conocer como hacer estas rutas dinamicas ya que las uso mucho para el sistema o si hay alguna otra forma de utlizar la libreria fstream
Cualquier ayuda es bienvenida o si pueden darme algun manual o recomendarme algo para poder descubrirlo por mi mismo.
 


Título: Re: Como utilizar fstream para archivos con rutas dinamicas
Publicado por: x64core en 15 Abril 2014, 18:04 pm
Simplemente obtener la ruta de la variable de entorno, podes usar GetEnvironmentVariable:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683188(v=vs.85).aspx

GetEnvironmentVariable(%windir%) -> strcat + "\system32\cmd.exe" -> file_exists()



Título: Re: Como utilizar fstream para archivos con rutas dinamicas
Publicado por: Stakewinner00 en 15 Abril 2014, 18:08 pm
Estuve haciendo unas pruebas y este código parece funcionar, el truco esta en la función getenv de la librería stdlib, el ejemplo esta en linux pero bueno.
Código
  1. #include <iostream>
  2. #include <stdlib.h>    
  3. int main ()
  4. {
  5. char* i;
  6. i=getenv("SHELL"); //quizás en tu caso sea "windir"
  7. std::cout << "Ruta relativa ";
  8. std::cout << i << std::endl;
  9. return 0;
  10. }
Espero que te sirva el ejemplo a parte de la info que paso el compañero.


Título: Re: Como utilizar fstream para archivos con rutas dinamicas
Publicado por: amchacon en 15 Abril 2014, 18:24 pm
Esta línea:
Código
  1. bool j = file_exists("%windir%\system32\cmd.exe"); // se puede usar file.exe pues para verficar

Se traduce como:
Código
  1. "%windir%system32cmd.exe"

Lo cual no es lo que quieres realmente.

Para comprobarlo este sencillo programa:
Código
  1. int main()
  2. {
  3.    char* a = "%windir%\system32\cmd.exe";
  4.    cout<<a<<endl;
  5.    return 0;
  6. }

La solución es ponerlo con doble \\:
Código
  1. bool j = file_exists("%windir%\\system32\\cmd.exe"); // se puede usar file.exe pues para verficar

Por cierto esta función:
Código
  1. bool file_exists(const char * f)
  2. {
  3.   ifstream file;
  4.   file.open(f);
  5.   if(file.fail())
  6.       return false;
  7.   file.close();
  8.   return true;
  9. }

Puede simplificarse:
Código
  1. bool file_exists(const char * f)
  2. {
  3.   ifstream file(f);
  4.   return file;
  5. }

Hace exactamente lo mismo. Aunque si te parece más clara puedes dejarla así:
Código
  1. bool file_exists(const char * f)
  2. {
  3.   ifstream file(f);
  4.   return file.good();
  5. }


Título: Re: Como utilizar fstream para archivos con rutas dinamicas
Publicado por: x64core en 15 Abril 2014, 18:26 pm
Notar que si es para Windows es mejor la Win32 y evitar usar ese tipo de librerias, olvide decirlo.


Título: Re: Como utilizar fstream para archivos con rutas dinamicas
Publicado por: amchacon en 15 Abril 2014, 18:29 pm
Notar que si es para Windows es mejor la Win32 y evitar usar ese tipo de librerias, olvide decirlo.
En potencia sí, pero en simpleza no me atrevería a decir eso (malditas Windows API ;D).

Si no necesita cosas de ficheros muy concretas, le basta y le sobra con la librería estándar.


Título: Re: Como utilizar fstream para archivos con rutas dinamicas
Publicado por: Stakewinner00 en 15 Abril 2014, 18:32 pm
Ya que estoy añado que si uno quiere dedicarse a programar en windows si sería bueno practicar y usar la librería de windows pero si es solo para pruebas puntuales y luego tienes pensado programar más en linux por ejemplo entonces prefiero usar librerías estándares que librerías propias del SO.

Bueno, de momento creo que ya tienes 3 métodos distintos para hacer lo mismo...

Saludos


Título: Re: Como utilizar fstream para archivos con rutas dinamicas
Publicado por: x64core en 15 Abril 2014, 18:40 pm
En potencia sí, pero en simpleza no me atrevería a decir eso (malditas Windows API ;D).

Si no necesita cosas de ficheros muy concretas, le basta y le sobra con la librería estándar.
Bueno no se necesita tanta ciencia:

Código
  1. if(GetEnvironmentVariableW(TEXT("%windir%"),Buffer,sizeof(Buffer) / sizeof(Buffer[0])) > 0)
  2. {
  3.    wcscat(Buffer,TEXT("\\system32\\cmd.exe"));
  4.    file_exists(Buffer);
  5.    ...
  6. }
  7.  
pero bueno.