comprobar si existe un archivo

Iniciado por MasterPunk, 26 Enero 2012, 16:06 PM

0 Miembros y 1 Visitante están viendo este tema.

MasterPunk

Hola, esto deberia devolver true si existe el archivo, y false si no existe, pero siempre devuelve true, ¿por que?

Código (cpp) [Seleccionar]
bool existe(){
    fstream ok;
    char texto[200];
    ok.open("C:\\thanks.txt", ios::in); // Comprueba si existe thanks.txt
    ok >> texto; // Leo una primera linea
    if (!ok.eof()){
        ok.close();
        return false;
    }
    else{
        ok.close();
        return true;
    }
}


127 C:\Users\*\Desktop\*\main.cpp [Warning] the address of `bool existe()', will always evaluate as `true'

EDITO: funciona perfectamente, el problema estaba al llamar a la funcion.
disculpad las molestias

Xandrete

#1

Hace un tiempo escribí sobre una manera (no portable, pues sólo funcionaría en sistemas Unix) de llevar algo así acabo. Te pongo el link (para que veas el contexto) y el código (es una función).

http://foro.elhacker.net/empty-t350434.0.html

Código (cpp) [Seleccionar]
int existsFile(char* filename) {
FILE* f = NULL;
f = fopen(filename,"r");
if (f == NULL && errno == ENOENT)
return 0;
else {
fclose(f);
return 1;
}
}


Como puedes comprobar, originalmente era una función para C (si quieres, puedes usarla en C++ tal cual o adaptarla como más te convenga). Se incluye previamente la librería errno.h, que no tiene definidos los mismos códigos de error en Unix y en Windows (ENOENT corresponde al error genérico "No such file or directory", que si no me equivoco, no está definido en Windows). Si quisieras hacer algo parecido en Windows, tendrás que incorporar alguna librería propia de ese S.O. (es posible que haya una manera portable de hacer esto, pero ahora mismo estoy enfermo y no puedo pensar con mucha claridad, así que cedo el testigo a otra persona >_<).

Saludos, jefe.

EDITO: No leí tu edito >.<, lo siento

x64core

si es en W$ porque no usar simplemente la api FileExist

MasterPunk

Uso windows.

Cita de: RHL en 26 Enero 2012, 19:05 PM
si es en W$ porque no usar simplemente la api FileExist

Pues porque me acabo de enterar de que existe jajaja
Y a google no le apetece decirme como se usa.

x64core

#4
perdon yo me equivoque LOL
no existe una api asi, tenia una funcion que se llamaba asi xd

#include <fstream>

inline bool FileExists(const char * filename)
{
 return std::ifstream(filename);
}

int main()
{
   bool j = FileExists("F:\\Windows\\Notepad.exe");
return 0;
}


creo que con la api getAttr se puede hacer tambien

BlackZeroX

De hecho puedes hacerlo con el api: GetFileAttributes http://msdn.microsoft.com/en-us/library/windows/desktop/aa364944%28v=vs.85%29.aspx, si te retorna 0 es que no existe...
The Dark Shadow is my passion.

Foxy Rider

¿Y por qué no simplemente fopen()? es simple, es estándar y es portable.
naturalmente hay que olvidarse de errno, pero si un simple fopen pidiendo acceso de lectura no retorna un descriptor, entonces es claro que ese fichero está fuera del alcance (exista o no) y se puede dar un mensaje de que el fichero no existe o no tiene los permisos apropiados.

Saludos.

P.S → Guarda con usar inline, si llamás la función muchas veces, pero la usás poco (en un bucle, por ejemplo) está bien usarlo por que se "expande" el código una vez, ahora ... si la usás de forma dispersa lo mejor es evitar inline, por que causa que el binario engorde con código duplicado.
Depende del compilador igual si obedece inline, lo toma como una sugerencia, o si optimiza esos casos de código duplicado.

P.S 2 →  PEEERO, en este caso, consume más tiempo hacer la operación de I/O al acceder al disco duro (que, tiene una linda latencia si no es un SSD) que lo que te ahorrás en el par de instrucciones assembly de llamar una función abriendo una instancia en el stack y demás, así que aunque usases la función en un for, lo que ganás es siquiera medible.


Xandrete

Cita de: [Alex] en 27 Enero 2012, 22:16 PM
¿Y por qué no simplemente fopen()? es simple, es estándar y es portable.
naturalmente hay que olvidarse de errno, pero si un simple fopen pidiendo acceso de lectura no retorna un descriptor, entonces es claro que ese fichero está fuera del alcance (exista o no) y se puede dar un mensaje de que el fichero no existe o no tiene los permisos apropiados.

Saludos.

P.S → Guarda con usar inline, si llamás la función muchas veces, pero la usás poco (en un bucle, por ejemplo) está bien usarlo por que se "expande" el código una vez, ahora ... si la usás de forma dispersa lo mejor es evitar inline, por que causa que el binario engorde con código duplicado.
Depende del compilador igual si obedece inline, lo toma como una sugerencia, o si optimiza esos casos de código duplicado.

P.S 2 →  PEEERO, en este caso, consume más tiempo hacer la operación de I/O al acceder al disco duro (que, tiene una linda latencia si no es un SSD) que lo que te ahorrás en el par de instrucciones assembly de llamar una función abriendo una instancia en el stack y demás, así que aunque usases la función en un for, lo que ganás es siquiera medible.



¡Hola!

Si, claro. Si no puedes abrir el archivo y no te hace falta saber exactamente el motivo, ya va bien así (yo hacía lo propio con el open cuando me devolvía -1). Pero cuando quieres saber que no puedes abrir el archivo porque éste no existe y sólo porque éste no existe, tienes que recurrir a otros medios.

¡Saludos!

burbu_1

puedes usar el api FindFirstFile, y si el archivo no existe GetLastError devuelve ERROR_FILE_NOT_FOUND.

wachi

si,puedes usar FindFirstFile, por supuesto acompañada de FindNextFile.....
a mi en lo personal me gustan mucho estas ,también si usas c++builder la vcl.h tiene una funcion llamada FileExists() que te permite saber si un archivo existe ....

saludos....
Si lo que vas a decir no es mas bello que el silencio : no lo digas