![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
|||
|
|||
|
Lo siento. Me rindo. Creo que Microsoft nos toma el pelo con el API. Son casi las 2 de la mañana y no puedo más. Llevo toda la tarde con esto y estoy bloqueado. Me devuelve vacia la cadena RegFich.cAlternateFilename, y sin embargo me devuelve correcta la de RegFich.cFilename.
Que alquien me lo explique. Yo desisto. A lo mejor tengo un error en el código y no me doy cuenta... De todas formas creo que el tema no interesa mucho (Solo 27 visitas en dos dias) function RutaDOS(NomFich:String): String; label Salir; var RegFich: TWin32FindData; Control: String; DirActual: String; RutaLarga: string; NombreCorto: String; RutaCorta: String; xx: integer; ControlBusqueda:THandle; AlgoFalla:Boolean; begin ////////////////////////////////////////////////////////////////////////////// // Primero Transformamos la ruta de Directorios hasta el Actual a nombres cortos // 1.- Obtenemos la ruta en que estamos AlgoFalla:=False; //Control del resultado GetDir(0,RutaLarga); RutaLarga:=RutaLarga+'\'+NomFich; //RutaCorta empieza vacía para ir añadiendo en while Length(Rutalarga) > 3 RutaCorta:=''; while Length(RutaLarga) > 2 // Si no es el directorio Raiz (Unidad:\) do begin //Buscamos el directorio que investigaremos actualmente xx:=Length(RutaLarga); while RutaLarga[xx]<>'\' do xx:=xx-1; DirActual:=Copy(RutaLarga,xx+1,Length(RutaLarga)-xx); Delete(Rutalarga,xx,Length(RutaLarga)-xx+1); // eliminamos el directorio que estamos comprobando SetCurrentDirectory(PChar(RutaLarga+'\')); //Fijamos el directorio de búsqueda ControlBusqueda:=FindFirstFile(PChar(RutaLarga+'\'+DirActual), RegFich); if ControlBusqueda=INVALID_HANDLE_VALUE // Algo Falla then begin AlgoFalla:=True; Goto Salir; end else begin // ControlBusqueda<>INVALID_HANDLE_VALUE No hay fallo if RegFich.cFileName=DirActual then NombreCorto:=String(RegFich.cAlternateFilename) else while FindNextFile(ControlBusqueda,RegFich) do if RegFich.cFileName=DirActual then NombreCorto:=String(RegFich.cAlternateFilename); end;// ControlBusqueda<>INVALID_HANDLE_VALUE RutaCorta:=NombreCorto+'\'+RutaCorta; end; //while Length(RutaLarga) > 2 RutaCorta:=RutaLarga+'\'+RutaCorta; // en DirActual debe quedar "Unidad\:" // Aquí termina la ruta de los directorios ////////////////////////////////////////////////////////////////////////////// Salir: if AlgoFalla then RutaCorta:=''; RutaDOS:=RutaCorta; // Terminamos uso de FindFirst/FindNext Windows.FindClose(ControlBusqueda); end; |
|
#2
|
||||
|
||||
|
No, la razón de la "ineficiencia" de la API no es algo casual;
Cita:
Cita:
Cita:
Al grano;
Animos! |
|
#3
|
|||
|
|||
|
Otra vez Gracias cHakAll.
¡Qué mas quisiera yo que poder poner el código tan bonito como lo tengo en el editor de Delphi, pero no tengo ni idea cómo se hace. Conste que he buscado en el foro, pero no sé cómo lo hacéis. Comprenderás que no soy muy experto en el foro, llevo sólo 19 ó 20 posts. Pero prometo enterarme para la próxima vez que tenga que poner código. Bueno al grano, como dices tu. Siento informarte que el resultado obtenido con la función GetShortName que me has puesto, es exactamente el mismo que el que he obtenido con la RutaDOS, que yo te puse, es decir este es el resultado: "C:\\\\", el número de barrras es el mismo que los subdirectorios que hay hasta llegar al raiz. Mi SO es WXP Professional. Probado en el de mi hijo, que es Vista64, el resultado es idéntico, en el antiguo ME si funciona GetShortPathName, el RutaDOS y el GetShortName no los he probado. Vuelvo a darte las gracias y te pido que no pierdas más tiempo con este tema, no lo merece. Saludos Juan |
|
#4
|
||||
|
||||
El problema ocurria cuando el nombre dado era un 8.3 válido, ahora debería funcionar. Las etiquetas son [delphi] tu codigo aquí [/delph¡] ó el único boton cafe de la parte superior del editor. Saludos Última edición por cHackAll fecha: 25-03-2008 a las 23:47:07. |
|
#5
|
|||
|
|||
|
Gracias cHackAll (Ahora lo he escrito bien eh!)
No te esfuerces. Esl fallo es de Microsoft. Ahora funciona (?) si no es en el quinto subdirectorio con 9 o más caracteres iguales. Como GetShortPathName. En el quinto subdirectorio pone las dos primeras letras del directorio mas 4 caracteres en base 16 más el caracter 126 (~) mas un 1 y la barra \: mira es exactamente esto: C:\DATA\MISPRO~1\SUPERPAD\ES273A~1\RUTAW32.EXE la ruta larga es esta:C:\DATA\Mis Programas y mis licencias\SuperPad\Estoesimposible5\ RutaW32.exe Falla en el mismo sitio que GetShortPathName. Esta es la primera función que hice: [delphi] Function Ruta:string; var RutaCorta:String; DirActual:String; corto:array [0..MAX_PATH] of char; longitud:Cardinal; begin GetDir(0,DirActual); Longitud:= Sizeof(Corto) -1; GetShortPathName(PChar(DirActual),@corto,Longitud); RutaCorta:=String(Pchar(@corto)); if Length(RutaCorta)>3 then Ruta:=RutaCorta+'\' else Ruta:=RutaCorta; // si es el Dir Raiz C:\ ó A:\ la barra la pone sola end; [delphi/] A ver si he aprendido lo del código. El Resultado es el mismo. Ruego que lo compruebes moviendo el programita de prueba a un subdirectorio que sea el quinto con 9 o más caracteres iguales. Siempre gracias por tu tiempo y tu esfuerzo. Un saludo. |
|
#6
|
|||
|
|||
|
Gracias cHackAll (Ahora lo he escrito bien eh!)
No te esfuerces. Esl fallo es de Microsoft. Ahora funciona (?) si no es en el quinto subdirectorio con 9 o más caracteres iguales. Como GetShortPathName. En el quinto subdirectorio pone las dos primeras letras del directorio mas 4 caracteres en base 16 más el caracter 126 (~) mas un 1 y la barra \: mira es exactamente esto: C:\DATA\MISPRO~1\SUPERPAD\ES273A~1\RUTAW32.EXE la ruta larga es esta:C:\DATA\Mis Programas y mis licencias\SuperPad\Estoesimposible5\ RutaW32.exe Falla en el mismo sitio que GetShortPathName. Esta es la primera función que hice:
A ver si he aprendido lo del código. El Resultado es el mismo. Ruego que lo compruebes moviendo el programita de prueba a un subdirectorio que sea el quinto con 9 o más caracteres iguales. Siempre gracias por tu tiempo y tu esfuerzo. Un saludo. P.D. No te rías, he puesto la raya descolocada... |
|
#7
|
|||
|
|||
|
Gracias cHackAll:
Por todo lo que me has enseñado a mí y a todos en general. Por la labor de maestro que estás haciendo en el Foro. Un saludo. Juan. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Rellenar listbox con nombres de ficheros | eduarcol | Varios | 2 | 11-08-2007 02:40:03 |
| ¿ Cómo obtener los nombres de bases de datos? | Javi2 | Varios | 2 | 22-11-2006 09:46:21 |
| como obtener los nombres de archivos de un directorio | ilichhernandez | Varios | 3 | 14-07-2006 17:49:57 |
| Copiar nombres de ficheros a un Combo | Tomás | Varios | 2 | 12-01-2004 16:28:51 |
| Obtener nombres | hgiacobone | Varios | 1 | 23-07-2003 18:55:02 |
|