[Lazarus-es] problema con Unicode y CreateFileW

islanis en infomed.sld.cu islanis en infomed.sld.cu
Mie Oct 15 03:18:51 CEST 2014


Hola chicos acabo de darme cuenta de algo, que el error al parecer  
está mucho antes de llegar a esa función y les explico por que, les  
pondré como ejemplo que quiero copiar una carpeta que se llama  
"Áfolder", recuerden que esto es parte de un copiador, la cuestion  
está en que ya cuando llegamos a la función esta:
//--------------------------------------------------------
HSrc:=Windows.CreateFileW(PWideChar(UTF8Decode(SourceFile)),
                             GENERIC_READ,
                             FILE_SHARE_READ or FILE_SHARE_WRITE,
                             nil,
                             OPEN_EXISTING,
                             FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED
                             or  
IfThen(SourceIsNetwork,0,FILE_FLAG_NO_BUFFERING),
                             0);
         RaiseCopyErrorIfNot(HSrc<>INVALID_HANDLE_VALUE);
//--------------------------------------------------------
Pues claro que tiene que dar error al no coincidir los hash pues es  
que la carpeta no existe porque no ha sido creada o copiada por eso da  
error acá pero antes, mucho antes me percaté de que hay una rutina que  
en el transcurso de la iteración y la organización de lo que se va a  
copiar pues comete a mi entender un fallo, y es que solo pasa con lo  
que tiene tilde, o sea, en nuestro ejemplo la carpeta "Áfolder", y  
cuando llega a la rutina que al parecer lo que hace es que le asigna  
las propiedades pertinentes a cada uno de los archivos que son  
analizados por el sistema antes de copiar, o sea, en el proceso de  
preparación, pero, justo cuando le pregunta a la carpeta si es un  
directorio o no pues para mi sorpresa encontre que el sistema entiende  
que esto no es un directorio cuando en realidad lo es,la rutina es  
esta, ah AItemName es un camino a nuestra carpeta, o sea para poner un  
ejemplo pues es "c:\\Áfolder"
//--------------------------------------------------------
{ TAPI }

procedure TAPI.APIBaselistAddItem(ABaseListHandle: Integer;
   AItemName: WideString);
var Item:TBaseItem;
begin
   if not CheckHandle(ABaseListHandle,TBaseList) then Exit;

   Item:=TBaseItem.Create;
   Item.SrcName:=UTF8Encode(AItemName);
   Item.IsDirectory:=DirectoryExists(UTF8Encode(AItemName));// acá es  
donde veo que da el problema,

   (FHandleList[ABaseListHandle] as TBaseList).Add(Item);

   FLastError:=aeNone;
end;
//--------------------------------------------------------
Y esta es DirectoryExists que se encuentra dentro de sysutils.pp del lazarus

Function DirectoryExists (Const Directory : String) : Boolean;
var
   Attr:Dword;
begin
   Attr:=GetFileAttributes(PChar(Directory));
   if Attr <> $ffffffff then
     Result:= (Attr and FILE_ATTRIBUTE_DIRECTORY) > 0
   else
     Result:=False;
end;
//--------------------------------------------------------
al parecer el problema está en GetFileAttributes() o en el mismo  
DirectoryExists ahora si espero a que me den alguna respuesta ustedes.


Saludos y gracias de antemano.

José Mejuto <joshyfun en gmail.com> escribió:

> El 14/10/2014 a las #4, J.Alejandro Martinez Linares escribió:
>> Hola estoy tratando de reparar una versión de supercopier que es un
>> programa para copiar archivos y carpetas pero justo en la seccion que
>> les pongo abajo cada vez que el sitema se encuentra una carpeta con
>> tildes el sistema me da una excepción notificandome que no tiene acceso,
>> y justo en el fragmento que les muestro es donde el sistema se engancha
>
> Hola,
>
> Deberías de mostrar también de donde sacas SourceFile, si es un  
> ansistring, un utf8string o qué.
>
> -- 
>
>
> _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>



----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.



--
Nunca digas nunca, di mejor: gracias, permiso, disculpe.

Este mensaje le ha llegado mediante el servicio de correo electronico que ofrece Infomed para respaldar el cumplimiento de las misiones del Sistema Nacional de Salud. La persona que envia este correo asume el compromiso de usar el servicio a tales fines y cumplir con las regulaciones establecidas

Infomed: http://www.sld.cu/





More information about the Lazarus-es mailing list