elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  comprobar si existe un archivo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: comprobar si existe un archivo  (Leído 20,265 veces)
MasterPunk


Desconectado Desconectado

Mensajes: 447


(-A-)


Ver Perfil WWW
comprobar si existe un archivo
« en: 26 Enero 2012, 16:06 pm »

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

Código
  1. bool existe(){
  2.    fstream ok;
  3.    char texto[200];
  4.    ok.open("C:\\thanks.txt", ios::in); // Comprueba si existe thanks.txt
  5.    ok >> texto; // Leo una primera linea
  6.    if (!ok.eof()){
  7.        ok.close();
  8.        return false;
  9.    }
  10.    else{
  11.        ok.close();
  12.        return true;
  13.    }
  14. }

Código:
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


« Última modificación: 26 Enero 2012, 16:12 pm por MasterPunk » En línea

Xandrete

Desconectado Desconectado

Mensajes: 210



Ver Perfil
Re: comprobar si existe un archivo
« Respuesta #1 en: 26 Enero 2012, 17:50 pm »


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
  1. int existsFile(char* filename) {
  2. FILE* f = NULL;
  3. f = fopen(filename,"r");
  4. if (f == NULL && errno == ENOENT)
  5. return 0;
  6. else {
  7. fclose(f);
  8. return 1;
  9. }
  10. }

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


« Última modificación: 26 Enero 2012, 17:52 pm por Xandrete » En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: comprobar si existe un archivo
« Respuesta #2 en: 26 Enero 2012, 19:05 pm »

si es en W$ porque no usar simplemente la api FileExist
En línea

MasterPunk


Desconectado Desconectado

Mensajes: 447


(-A-)


Ver Perfil WWW
Re: comprobar si existe un archivo
« Respuesta #3 en: 26 Enero 2012, 21:40 pm »

Uso windows.

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.
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: comprobar si existe un archivo
« Respuesta #4 en: 26 Enero 2012, 21:56 pm »

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
« Última modificación: 26 Enero 2012, 21:59 pm por RHL » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: comprobar si existe un archivo
« Respuesta #5 en: 27 Enero 2012, 00:28 am »

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...
En línea

The Dark Shadow is my passion.
Foxy Rider


Desconectado Desconectado

Mensajes: 2.407


Deprecated


Ver Perfil WWW
Re: comprobar si existe un archivo
« Respuesta #6 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.

En línea

Xandrete

Desconectado Desconectado

Mensajes: 210



Ver Perfil
Re: comprobar si existe un archivo
« Respuesta #7 en: 30 Enero 2012, 20:42 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!
En línea

burbu_1

Desconectado Desconectado

Mensajes: 159


hamen gaoz


Ver Perfil
Re: comprobar si existe un archivo
« Respuesta #8 en: 30 Enero 2012, 23:43 pm »

puedes usar el api FindFirstFile, y si el archivo no existe GetLastError devuelve ERROR_FILE_NOT_FOUND.
En línea

wachi

Desconectado Desconectado

Mensajes: 57



Ver Perfil
Re: comprobar si existe un archivo
« Respuesta #9 en: 4 Febrero 2012, 04:19 am »

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....
 
En línea

Si lo que vas a decir no es mas bello que el silencio : no lo digas
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Comprobar si existe un archivo
Programación Visual Basic
{_The_Alwar_} 6 30,350 Último mensaje 20 Junio 2005, 01:50 am
por Slasher-K
Comprobar si un archivo en internet existe (SOLUCIONADO) « 1 2 »
Programación Visual Basic
Littl3 11 17,094 Último mensaje 14 Mayo 2008, 15:15 pm
por seba123neo
Comprobar si una web existe [reto?]
Programación Visual Basic
Psyke1 3 2,907 Último mensaje 6 Septiembre 2010, 23:26 pm
por bizco
[BASH] Comprobar si existe archivo, para evitar reemplazarlo
Scripting
WaAYa HaCK 3 4,521 Último mensaje 25 Febrero 2012, 00:42 am
por leogtz
mkisofs dice que el archivo no existe, pero si existe.
Software
huchoko 1 1,721 Último mensaje 22 Febrero 2019, 13:27 pm
por okik
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines