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;
|