[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