Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Extraer nombre de archivo de una ruta

Estas en el tema de Extraer nombre de archivo de una ruta en el foro de C/C++ en Foros del Web. Hola a todos Soy novato en C++, y me he largado a hacer una aplicación en Visual C++ para ver como me sale, y de ...
  #1 (permalink)  
Antiguo 18/11/2007, 21:41
Avatar de Hardrive  
Fecha de Ingreso: julio-2006
Ubicación: La Plata - Bs. As.
Mensajes: 65
Antigüedad: 17 años, 9 meses
Puntos: 0
Extraer nombre de archivo de una ruta

Hola a todos

Soy novato en C++, y me he largado a hacer una aplicación en Visual C++ para ver como me sale, y de paso ponerla en mi blog personal. El problema, es que necesitaría un función que me extraiga el nombre de una ruta ubicada en una editbox (CString source, sería la variante correspondiente a la editbox) y luego que me la devuelva si es posible en una LPCSTR o compatible.

Gracias de antemano


Salu2
  #2 (permalink)  
Antiguo 19/11/2007, 11:13
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: Extraer nombre de archivo de una ruta

Podes usar un puntero (source.c_str() para empezar) que busque el ultimo '\\'.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 19/11/2007, 16:12
Avatar de Hardrive  
Fecha de Ingreso: julio-2006
Ubicación: La Plata - Bs. As.
Mensajes: 65
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Extraer nombre de archivo de una ruta

Gracias amigo

Al final buscando info sobre el c_str(), encontre un codigo con strtok, lo adapte a mi gusto, ya aquí se los dejo por si a alguien le sirve:

Cita:
LPCSTR ExtractFileName (LPCSTR path)
{
char * cstr, *p;
LPCSTR name;
cstr = new char [sizeof(path)+1];
strcpy (cstr, path);
p=strtok (cstr,"\\");
while (p!=NULL)
{
p=strtok(NULL,"\\");
if(p!=NULL) name = p ;

}
return name;
}

Pueden cerrar el tema.

Salu2
  #4 (permalink)  
Antiguo 19/11/2007, 16:15
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: Extraer nombre de archivo de una ruta

Mas o menos esa era la idea, aunque no hace falta usar strtok, strchr es suficiente y mira que estas reservando memoria que despues no liberas. Podrias hacer lo que te digo usando el buffer original ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 19/11/2007, 17:38
Avatar de Hardrive  
Fecha de Ingreso: julio-2006
Ubicación: La Plata - Bs. As.
Mensajes: 65
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Extraer nombre de archivo de una ruta

Hola otra vez

Sobre lo de liberar memoria, pongo "delete[] cstr" y me tira un error "DAMAGE: after Normal Block". Sobre lo de strchr, seria lo mismo nada mas que reemplazandolo por strtok verdad?


Salu2
  #6 (permalink)  
Antiguo 19/11/2007, 17:47
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: Extraer nombre de archivo de una ruta

Cita:
Iniciado por Hardrive Ver Mensaje
Hola otra vez

Sobre lo de liberar memoria, pongo "delete[] cstr" y me tira un error "DAMAGE: after Normal Block". Sobre lo de strchr, seria lo mismo nada mas que reemplazandolo por strtok verdad?


Salu2
sizeof(path) no es correcto, eso devuelve el tamaño del puntero (4 bytes en 32 bits) y lo que necesitas es el tamaño de la cadena, tenes que usar strlen en ese caso pero como te decia antes, no hace falta para nada si la cadena la queres solo para lectura, con devolver un puntero de la cadena original (mas lo necesario para llegar hasta el nombre) es suficiente.

Aca tenes como funciona strchr.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 19/11/2007, 19:15
Avatar de Hardrive  
Fecha de Ingreso: julio-2006
Ubicación: La Plata - Bs. As.
Mensajes: 65
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Extraer nombre de archivo de una ruta

Gracias de nuevo :)

La función la dejé así, y me funciona bien:
Cita:
LPCSTR ExtractFileName (LPCSTR path)
{
char *p;
LPCSTR name;
p= strchr (path, 92); // el 92 reemplaza la \\
while (p!=NULL)
{
name = p+1; // el p+1 es para que no devuelva una \ de más
p= strchr (p+1, 92);
}
return name;
}
Me gustaría que me des tu opinión a ver si se puede mejorar o no.


Salu2
  #8 (permalink)  
Antiguo 20/11/2007, 10:37
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: Extraer nombre de archivo de una ruta

Lo unico que cambiaria si o si (agregaria en realidad), es que name este inicializado a cero siempre, o mejor, que sea igual a path (si no hay path todo es archivo). En este codigo cuando p sea cero al principio vas a retornar un valor indefinido.

Despues, esto no es una mejora real pero si hace el codigo mas legible, podes usar '\\' en vez de 92 (esto es un caracter, antes tenias una cadena "\\").

Yo usaria path tal como usas p, tambien cambiaria algunas cosas como usar un for en vez de un while pero son costumbres y practicas de cada uno.

Agrego: otra cosita que podes incluir es una comprobacion para que llegado el caso en que path termine justamente en \ no sigas trabajando.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 21/11/2007 a las 02:21
  #9 (permalink)  
Antiguo 20/11/2007, 19:25
Avatar de Hardrive  
Fecha de Ingreso: julio-2006
Ubicación: La Plata - Bs. As.
Mensajes: 65
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Extraer nombre de archivo de una ruta

Gracias nuevamente

He tomado algunos de tus consejos, y he decidido dejarlo así:

Cita:
LPCSTR ExtractFileName (LPCSTR path)
{
char *p;
LPCSTR name;
p= strchr (path, '\\');
while (p!=NULL)
{
name = p+1;
p= strchr (p+1, '\\');
}
if (!*name) return 0;
else return name;
}
Ahora, además he hecho una función para verificar si un archivo existe. El tema, es que lo he hecho con FindFirstFile:
Cita:
BOOL VerifyFilePath(LPCSTR path)
{
if(strchr(path, '*')!=0 | strchr(path, '?')!=0) return false; // para bloquear los comodines
WIN32_FIND_DATA FindFileData;
HANDLE verify;
verify = FindFirstFile(path, &FindFileData);
if (verify == INVALID_HANDLE_VALUE) return false;
if (strcmpi(ExtractFileName(path),FindFileData.cFileN ame)==0) {
FindClose(verify);
return true;
}
else {
FindClose(verify);
return false;
}
}
A mí me funciona bien, pero por ahí tu vez algún posible error o conoces una mejor manera de hacerlo.


Salu2

Última edición por Hardrive; 22/11/2007 a las 00:33
  #10 (permalink)  
Antiguo 21/11/2007, 02:21
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: Extraer nombre de archivo de una ruta

Cita:
Iniciado por Hardrive Ver Mensaje
He tomado algunos de tus consejos, y he decidido dejarlo así:
Lo de comprobar name es a gusto del usuario en realidad ya que strchr te va a devolver 0 (p= strchr (p+1, '\\');). Si siempre retornas name en esos casos vas a devolver una cadena vacia, de la otra manera un 0.

Cita:
Iniciado por Hardrive Ver Mensaje
Ahora, además he hecho una función para verificar si un archivo existe. El tema, es que lo he hecho con FindFirstFile:
Que yo recuerde la manera optima de comprobar la existencia de un archivo es usar GetFileAttributes.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #11 (permalink)  
Antiguo 07/12/2007, 09:35
Avatar de Hardrive  
Fecha de Ingreso: julio-2006
Ubicación: La Plata - Bs. As.
Mensajes: 65
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Extraer nombre de archivo de una ruta

Lamento mucho no haberme pasado antes.

Muchas gracias la función getFileAttributes me ha funcionado excelente, aquí he hecho una función que devuelve true si existe el archivo y false si no existe:
Cita:
BOOL VerifyFilePath(LPCSTR path) {
DWORD exist;
exist = GetFileAttributes(path);

if(exist == 0xFFFFFFFF ) {
return false;
}
else {
return true;
}
}
Gracias Eternal Idol


Salu2
  #12 (permalink)  
Antiguo 07/12/2007, 09:38
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Re: Extraer nombre de archivo de una ruta

De nada, siempre es bueno usar las constantes del sistema como INVALID_FILE_ATTRIBUTES en este caso
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:59.