Como utilizar fstream para archivos con rutas dinamicas

Iniciado por kerkox, 15 Abril 2014, 17:17 PM

0 Miembros y 2 Visitantes están viendo este tema.

kerkox

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 (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>
#include <fstream>


using namespace std;

bool file_exists(const char * f)
{
    ifstream file;
    file.open(f);
    if(file.fail())
        return false;
    file.close();
    return true;
}

int main()
{

cout << "Vamos a ver si es fichero existe  " <<endl;
cout << endl;
cin.get();

//con esta no funciona
bool j = file_exists("%windir%\system32\cmd.exe"); // se puede usar file.exe pues para verficar
/*
Peo con esta si funciona
bool j = file_exists("c:\\windows\\system32\\cmd.exe");
*/


if (j)
{

cout << "si existe el archivo  "<< endl;
cin.get();

}
else
{
    cout << "No existe el archivo" << endl;
    cin.get();
}

return 0;


}


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.
 

x64core

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()


Stakewinner00

#2
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 (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>    
int main ()
{
char* i;
i=getenv("SHELL"); //quizás en tu caso sea "windir"
std::cout << "Ruta relativa ";
std::cout << i << std::endl;
return 0;
}

Espero que te sirva el ejemplo a parte de la info que paso el compañero.

amchacon

#3
Esta línea:
Código (cpp) [Seleccionar]
bool j = file_exists("%windir%\system32\cmd.exe"); // se puede usar file.exe pues para verficar

Se traduce como:
Código (cpp) [Seleccionar]
"%windir%system32cmd.exe"

Lo cual no es lo que quieres realmente.

Para comprobarlo este sencillo programa:
Código (cpp) [Seleccionar]
int main()
{
   char* a = "%windir%\system32\cmd.exe";
   cout<<a<<endl;
   return 0;
}


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

Por cierto esta función:
Código (cpp) [Seleccionar]
bool file_exists(const char * f)
{
  ifstream file;
  file.open(f);
  if(file.fail())
      return false;
  file.close();
  return true;
}


Puede simplificarse:
Código (cpp) [Seleccionar]
bool file_exists(const char * f)
{
  ifstream file(f);
  return file;
}


Hace exactamente lo mismo. Aunque si te parece más clara puedes dejarla así:
Código (cpp) [Seleccionar]
bool file_exists(const char * f)
{
  ifstream file(f);
  return file.good();
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

x64core

Notar que si es para Windows es mejor la Win32 y evitar usar ese tipo de librerias, olvide decirlo.

amchacon

Cita de: 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.
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.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Stakewinner00

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

x64core

Cita de: amchacon en 15 Abril 2014, 18:29 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 (cpp) [Seleccionar]
if(GetEnvironmentVariableW(TEXT("%windir%"),Buffer,sizeof(Buffer) / sizeof(Buffer[0])) > 0)
{
    wcscat(Buffer,TEXT("\\system32\\cmd.exe"));
    file_exists(Buffer);
    ...
}

pero bueno.