API's windows para lectura escritura archivos
Publicado por miguel (153 intervenciones) el 30/08/2009 05:09:09
Hola, por si os viene bien a alguién: powerbuilder es lenta en operaciónes de cadena.
Si estaís escribiendo / leyendo archivos a disco en bloques de 32kb. (lento si son un poco más grandes). hay solución.
------------------------------- leer un archivo a blob ( habrá que adaptar el código) ---------------
// desde powerbuilder script
// of_readfile llama a FileRead api de windows
nvo_blob luo_blob
blob lblob_mi_blob
string ls_archivo
ls_archivo = 'C:algun_archivo_en_mi_disco_duro' // importante tiene que ser en local no en red.
luo_blob = create nvo_blob
setpointer(hourglass!)
if not luo_blob.of_readfile(ls_archivo, blb_blob_mi_blob) then
// error de lectura
destroy luo_blob
return -1
end if
// todo ha ido bien si hemos llegado hasta aquí
// hacer lo que haga falta con el archivo ubicado en lblob_mi_blob
.......
.......
destroy luo_blob
return 0
// para
--------------------------------------------- escribir un blob a archivo en disco local ---------------------
integer li_cont, i, n, li_fn, li_dif
blob lblb_nulo
nvo_blob luo_blob
string ls_filename_copy, ls_fname, ls_fext, ls_path, ls_org_sin_path
string ls_lista_arch[], ls_msg[]
datetime ldt_fechas_arch[], ldt_ahora
luo_blob = create nvo_blob // contiene funciones para tratamiento blob
ls_filename = "c:archivo_en_disco_duro_local" // debe ser local para archivos grandes
// of_writefile llama a FileWrite api de windows
setpointer(hourglass!)
if not luo_blob.of_writeFile(ls_filename, ablb_blob) then
ablb_blob = lblb_nulo
// error de escritura
//ls_msg[1] = as_filename
//gnv_app.inv_error.of_message('569', ls_msg)
destroy luo_blob
return -2
end if
destroy luo_blob; destroy luo_kernell
return 0
--------------------------------------------------------------------------------------------------
os adjunto el código del objeto nvo_blob: ( no cabe de golpe o sea que teneís que copiarlo primero a un archivo y luego copiar el siguiente correo también para que todo esté dentro de nvo_blob.sru, o me lo podeís solicitar via: [email protected])
el objeto usa otro nvo_kernell32, que postearé inmediatemente después de este mensaje
-- salvar el siguiente texto que hay debajo de ---------, (como nvo_blob.sru en disco duro) e importarlo en powerbuilder hacia una librería. (primero tienes que tener haber hecho lo mismo con el objeto nvo_kernell32 que está en los siguiente mensajes....
-------------------------------------------------------- parte 1 de 2
$PBExportHeader$nvo_blob.sru
$PBExportComments$objeto para leer escribir blobs desde hacia archivo,
forward
global type nvo_blob from nonvisualobject
end type
end forward
type uuid from structure
unsignedlong data1
integer data2
integer data3
blob data4
end type
global type nvo_blob from nonvisualobject
end type
global nvo_blob nvo_blob
type prototypes
//--------------- últ. parám. de MoveFileExA:
// MOVEFILE_REPLACE_EXISTING 0x00000001
// MOVEFILE_COPY_ALLOWED 0x00000002 (para mover hacia otro volumen/disco)
// MOVEFILE_DELAY_UNTIL_REBOOT 0x00000004
// MOVEFILE_WRITE_THROUGH 0x00000008
Function boolean MoveFileExA( &
ref string cfrom, &
ref string cto, &
ref long flag) LIBRARY "Kernel32.dll"
Function ulong GetModuleFileName (ulong hinstModule, ref string lpszPath, ulong cchPath ) Library "KERNEL32.DLL" Alias for "GetModuleFileNameA"
FUNCTION ulong GetTempPath (long nBufferLength, &
ref string lpBuffer ) LIBRARY "KERNEL32.DLL" Alias for "GetTempPathA"
Function uint GetWindowsDirectoryA( &
ref string dirtext, uint textlen) &
library "KERNEL32.DLL"
Function ulong CreateFile ( &
string lpFileName, &
ulong dwDesiredAccess, &
ulong dwShareMode, &
ulong lpSecurityAttributes, &
ulong dwCreationDisposition, &
ulong dwFlagsAndAttributes, &
ulong hTemplateFile &
) Library "kernel32.dll" Alias For "CreateFileA"
Function boolean CloseHandle ( &
ulong hObject &
) Library "kernel32.dll"
Function boolean WriteFile ( &
ulong hFile, &
Ref blob lpBuffer, &
ulong nNumberOfBytesToRead, &
Ref ulong lpNumberOfBytesRead, &
ulong lpOverlapped &
) Library "kernel32.dll"
Function boolean ReadFile ( &
ulong hFile, &
Ref blob lpBuffer, &
ulong nNumberOfBytesToRead, &
Ref ulong lpNumberOfBytesRead, &
ulong lpOverlapped &
) Library "kernel32.dll"
Function long UuidCreate ( &
Ref UUID pId &
) Library "rpcrt4.dll"
Function long UuidToString ( &
Ref UUID Uuid, &
Ref ulong StringUuid &
) Library "rpcrt4.dll" Alias For "UuidToStringA"
Function long RpcStringFree ( &
Ref ulong pString &
) Library "rpcrt4.dll" Alias For "RpcStringFreeA"
Subroutine CopyMemory ( &
Ref string Destination, &
ulong Source, &
long Length &
) Library "kernel32.dll" Alias For "RtlMoveMemory"
Function long FindMimeFromData ( &
ulong pBC, &
blob pwzUrl, &
blob pBuffer, &
ulong cbSize, &
ulong pwzMimeProposed, &
ulong dwMimeFlags, &
ref ulong ppwzMimeOut, &
ulong dwReserved &
) Library "urlmon.dll"
Function long SendStringMessage ( &
long lhWnd, &
uint Msg, &
Ref string wParam, &
long lParam &
) Library "user32.dll" Alias For "SendMessageA"
//function boolean SetFileAttributes( ref string lpFileName, ulong dwFileAttributes ) Library "user32.dll"
end prototypes
type variables
Private:
Constant String CRLF = Char(13) + Char(10)
Boolean ib_html
Boolean ib_receipt
Boolean ib_authenticate
Integer ii_port = 25
String is_userid
String is_passwd
String is_server
String is_subject
String is_body
String is_FromEmail
String is_FromName
String is_ToEmail[]
String is_ToName[]
String is_CcEmail[]
String is_CcName[]
String is_BccEmail[]
String is_BccName[]
String is_AttachFile[]
Uint iui_socket
end variables
forward prototypes
public function boolean of_readfile (string as_filename, ref blob ablob_data)
public function boolean of_writefile (string as_filename, ref blob ablob_data)
public function string of_getappdir ()
public function string of_getwintempdir ()
public function boolean of_movefile (string as_origen, string as_destino)
end prototypes
Si estaís escribiendo / leyendo archivos a disco en bloques de 32kb. (lento si son un poco más grandes). hay solución.
------------------------------- leer un archivo a blob ( habrá que adaptar el código) ---------------
// desde powerbuilder script
// of_readfile llama a FileRead api de windows
nvo_blob luo_blob
blob lblob_mi_blob
string ls_archivo
ls_archivo = 'C:algun_archivo_en_mi_disco_duro' // importante tiene que ser en local no en red.
luo_blob = create nvo_blob
setpointer(hourglass!)
if not luo_blob.of_readfile(ls_archivo, blb_blob_mi_blob) then
// error de lectura
destroy luo_blob
return -1
end if
// todo ha ido bien si hemos llegado hasta aquí
// hacer lo que haga falta con el archivo ubicado en lblob_mi_blob
.......
.......
destroy luo_blob
return 0
// para
--------------------------------------------- escribir un blob a archivo en disco local ---------------------
integer li_cont, i, n, li_fn, li_dif
blob lblb_nulo
nvo_blob luo_blob
string ls_filename_copy, ls_fname, ls_fext, ls_path, ls_org_sin_path
string ls_lista_arch[], ls_msg[]
datetime ldt_fechas_arch[], ldt_ahora
luo_blob = create nvo_blob // contiene funciones para tratamiento blob
ls_filename = "c:archivo_en_disco_duro_local" // debe ser local para archivos grandes
// of_writefile llama a FileWrite api de windows
setpointer(hourglass!)
if not luo_blob.of_writeFile(ls_filename, ablb_blob) then
ablb_blob = lblb_nulo
// error de escritura
//ls_msg[1] = as_filename
//gnv_app.inv_error.of_message('569', ls_msg)
destroy luo_blob
return -2
end if
destroy luo_blob; destroy luo_kernell
return 0
--------------------------------------------------------------------------------------------------
os adjunto el código del objeto nvo_blob: ( no cabe de golpe o sea que teneís que copiarlo primero a un archivo y luego copiar el siguiente correo también para que todo esté dentro de nvo_blob.sru, o me lo podeís solicitar via: [email protected])
el objeto usa otro nvo_kernell32, que postearé inmediatemente después de este mensaje
-- salvar el siguiente texto que hay debajo de ---------, (como nvo_blob.sru en disco duro) e importarlo en powerbuilder hacia una librería. (primero tienes que tener haber hecho lo mismo con el objeto nvo_kernell32 que está en los siguiente mensajes....
-------------------------------------------------------- parte 1 de 2
$PBExportHeader$nvo_blob.sru
$PBExportComments$objeto para leer escribir blobs desde hacia archivo,
forward
global type nvo_blob from nonvisualobject
end type
end forward
type uuid from structure
unsignedlong data1
integer data2
integer data3
blob data4
end type
global type nvo_blob from nonvisualobject
end type
global nvo_blob nvo_blob
type prototypes
//--------------- últ. parám. de MoveFileExA:
// MOVEFILE_REPLACE_EXISTING 0x00000001
// MOVEFILE_COPY_ALLOWED 0x00000002 (para mover hacia otro volumen/disco)
// MOVEFILE_DELAY_UNTIL_REBOOT 0x00000004
// MOVEFILE_WRITE_THROUGH 0x00000008
Function boolean MoveFileExA( &
ref string cfrom, &
ref string cto, &
ref long flag) LIBRARY "Kernel32.dll"
Function ulong GetModuleFileName (ulong hinstModule, ref string lpszPath, ulong cchPath ) Library "KERNEL32.DLL" Alias for "GetModuleFileNameA"
FUNCTION ulong GetTempPath (long nBufferLength, &
ref string lpBuffer ) LIBRARY "KERNEL32.DLL" Alias for "GetTempPathA"
Function uint GetWindowsDirectoryA( &
ref string dirtext, uint textlen) &
library "KERNEL32.DLL"
Function ulong CreateFile ( &
string lpFileName, &
ulong dwDesiredAccess, &
ulong dwShareMode, &
ulong lpSecurityAttributes, &
ulong dwCreationDisposition, &
ulong dwFlagsAndAttributes, &
ulong hTemplateFile &
) Library "kernel32.dll" Alias For "CreateFileA"
Function boolean CloseHandle ( &
ulong hObject &
) Library "kernel32.dll"
Function boolean WriteFile ( &
ulong hFile, &
Ref blob lpBuffer, &
ulong nNumberOfBytesToRead, &
Ref ulong lpNumberOfBytesRead, &
ulong lpOverlapped &
) Library "kernel32.dll"
Function boolean ReadFile ( &
ulong hFile, &
Ref blob lpBuffer, &
ulong nNumberOfBytesToRead, &
Ref ulong lpNumberOfBytesRead, &
ulong lpOverlapped &
) Library "kernel32.dll"
Function long UuidCreate ( &
Ref UUID pId &
) Library "rpcrt4.dll"
Function long UuidToString ( &
Ref UUID Uuid, &
Ref ulong StringUuid &
) Library "rpcrt4.dll" Alias For "UuidToStringA"
Function long RpcStringFree ( &
Ref ulong pString &
) Library "rpcrt4.dll" Alias For "RpcStringFreeA"
Subroutine CopyMemory ( &
Ref string Destination, &
ulong Source, &
long Length &
) Library "kernel32.dll" Alias For "RtlMoveMemory"
Function long FindMimeFromData ( &
ulong pBC, &
blob pwzUrl, &
blob pBuffer, &
ulong cbSize, &
ulong pwzMimeProposed, &
ulong dwMimeFlags, &
ref ulong ppwzMimeOut, &
ulong dwReserved &
) Library "urlmon.dll"
Function long SendStringMessage ( &
long lhWnd, &
uint Msg, &
Ref string wParam, &
long lParam &
) Library "user32.dll" Alias For "SendMessageA"
//function boolean SetFileAttributes( ref string lpFileName, ulong dwFileAttributes ) Library "user32.dll"
end prototypes
type variables
Private:
Constant String CRLF = Char(13) + Char(10)
Boolean ib_html
Boolean ib_receipt
Boolean ib_authenticate
Integer ii_port = 25
String is_userid
String is_passwd
String is_server
String is_subject
String is_body
String is_FromEmail
String is_FromName
String is_ToEmail[]
String is_ToName[]
String is_CcEmail[]
String is_CcName[]
String is_BccEmail[]
String is_BccName[]
String is_AttachFile[]
Uint iui_socket
end variables
forward prototypes
public function boolean of_readfile (string as_filename, ref blob ablob_data)
public function boolean of_writefile (string as_filename, ref blob ablob_data)
public function string of_getappdir ()
public function string of_getwintempdir ()
public function boolean of_movefile (string as_origen, string as_destino)
end prototypes
Valora esta pregunta
0