Autor
|
Tema: comprobar si existe un archivo (Leído 20,926 veces)
|
MasterPunk
Desconectado
Mensajes: 447
(-A-)
|
Hola, esto deberia devolver true si existe el archivo, y false si no existe, pero siempre devuelve true, ¿por que? 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
|
|
« Última modificación: 26 Enero 2012, 16:12 pm por MasterPunk »
|
En línea
|
|
|
|
Xandrete
Desconectado
Mensajes: 210
|
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.htmlint 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
|
|
« Última modificación: 26 Enero 2012, 17:52 pm por Xandrete »
|
En línea
|
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
si es en W$ porque no usar simplemente la api FileExist
|
|
|
En línea
|
|
|
|
MasterPunk
Desconectado
Mensajes: 447
(-A-)
|
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
Mensajes: 1.908
|
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
|
|
|
|
|
Foxy Rider
Desconectado
Mensajes: 2.407
Deprecated
|
¿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
Mensajes: 210
|
¿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
Mensajes: 159
hamen gaoz
|
puedes usar el api FindFirstFile, y si el archivo no existe GetLastError devuelve ERROR_FILE_NOT_FOUND.
|
|
|
En línea
|
|
|
|
wachi
Desconectado
Mensajes: 57
|
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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Comprobar si existe un archivo
Programación Visual Basic
|
{_The_Alwar_}
|
6
|
30,813
|
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,800
|
14 Mayo 2008, 15:15 pm
por seba123neo
|
|
|
Comprobar si una web existe [reto?]
Programación Visual Basic
|
Psyke1
|
3
|
3,069
|
6 Septiembre 2010, 23:26 pm
por bizco
|
|
|
[BASH] Comprobar si existe archivo, para evitar reemplazarlo
Scripting
|
WaAYa HaCK
|
3
|
4,707
|
25 Febrero 2012, 00:42 am
por leogtz
|
|
|
mkisofs dice que el archivo no existe, pero si existe.
Software
|
huchoko
|
1
|
2,026
|
22 Febrero 2019, 13:27 pm
por okik
|
|