![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Una vez q agregues la libreria (o unidad, no se como le digan) no deberia dar el error.
la otra manera q plasmas tambien es vàlida
__________________
Los Estados Unidos parecen destinados por la Providencia para plagar la América de miserias a nombre de la libertad." Simón Bolívar (Carta al Coronel Inglés Patricio Cambell 05/08/1829). |
|
#2
|
||||
|
||||
|
Deberías declarar el Resultado como Int64, por aquello de archivos grandes.
Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
|
#3
|
|||
|
|||
|
Todas las respuestas me están siendo de gran ayuda.
Gracias a todos. Por cierto,¿Donde puñetas encuentro la guía de estilo?. Gracias otra vez. |
|
#4
|
|||
|
|||
|
El Código sigue siendo erróneo
En fin. El caso es que me gustaría comprender como delphi trata los ficheros via API-Windows.
He escrito el siguiente código al objeto de tratar el tipo TByHandleFileInformation. Según "Los Tomos de delphi: Núcleo del Api-Win32" ed. Danysoft 1999 viene definido de la siguiente forma: TByHandleFileInformation = record dwFileAttributes: DWORD; ftCreationTime: TFileTime; ftLastAccessTime: TfileTime; ftLastWriteTime: TFileTime; dwVolumeSerialNumber: DWORD; nFileSizeHigh: DWORD; nFileSizeLow: DWORD; nNumberOfLinks: DWORD; nFileIndexHigh: DWORD; nFileIndexLow: DWORD; end. Pues bien, he escrito el siguiente código al objeto de comprobar el tipo: procedure TForm1.Button3Click(Sender: TObject); var hfile: integer; fileinfo: tbyhandlefileinformation; tamaño1,tamaño2:dword; begin tamaño1:=0; tamaño2:=0; hfile:=CreateFile(PChar(ShelllistView1.SelectedFolder.PathName), generic_read,0,@security,Open_existing,file_attribute_normal,0); if (hfile=invalid_handle_value) then Label1.Caption:='Handle Invalido' else Begin getfileinformationbyhandle(hfile,fileinfo); tamaño1:=fileinfo.nFileSizelow; tamaño2:=fileinfo.nfilesizeHigh; Label2.Caption:=inttostr(tamaño1); Label3.Caption:=inttostr(tamaño2); closehandle(hfile) end; tamaño1 siempre me da el valor 2.012.174.878 y tamaño2: 2.010.279.026 mientras que con el código de http://www.delphi3000.com/articles/article_2686.asp obtengo siempre el tamaño correcto. ¿Que es lo que está mal en el código anterior? Los tipos están declarados como DWORD, igual que en el registro, las variables inicializadas, el Handle no me da error, etc, etc. Gracias por vuestro valioso tiempo. Saludos. |
|
#5
|
||||
|
||||
|
No sé bien que estas usando, pero una carpeta no tiene tamaño, tienes que sumar el tamaño de todos los archivos que tiene dentro. Normalmente se usa una rutina recursiva.
Para hallar el tamaño exacto de un archivo sería: Código:
var exacto : int64; begin exacto := nfilesizehigh * MAXCARDINAL + nfilesizeLow; El tamaño exacto viene dado en Bytes. Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
|
#6
|
|||
|
|||
|
Lepe: Probaré tu Código
No se bien a que te refieres cuando dices que no sabes bién lo que estoy usando; si te refieres al compilador utilizo Delphi 2006; si te refieres al código es tal y como lo escribí en el mensaje anterior; tengo un ShellTreeview linkado a un ShellListview y desde éste último selecciono un fichero en concreto.
Shelllistview.SelectedFolder.PathName me devuelve la ruta completa de "un" fichero, ¿No es asi?; de hecho si utilizo extractfilename(shelllistview.selectedforlder.pathname) me devuelve el nombre del fichero seleccionado; ademas si fuera como tu dices... if (hfile=invalid_handle_value) ¿no devolvería True? No obstante probaré el código que me envías (en estos momentos no tengo tiempo). ¿Podrías decirme donde encuentro una buena referencia sobre sysutils? ¿Porqué razón es necesario multiplicar nfilesizehigh por MAXCARDINAL? No se si todo esto es abusar mucho de vuestra paciencia, pero de todos modos muchas gracias. Saludos. ![]() |
|
#7
|
||||
|
||||
|
Reconozco que no he usado mucho los controles ShellTreeview y ShellListView, por tanto, al ver en tu codigo SelectedFolder.PathName, creía que el objeto seleccionado era una carpeta en lugar de un archivo.
Sobre sysutils, deberías tenerlo en el "uses" de tu formulario, es simplemente una unidad que tienes que usar para que reconozca la constante MAXCARDINAL. El hecho de multiplicar por MAXCARDINAL, es por definición de la API de windows, no usan un tipo de datos Int64 (que es mucho mayor que un DWORD), así que dividen ese valor en 2 valores, la parte alta (filesizeHigh) y la parte baja (filesizeLow). Imagina que queremos guardar un valor de 8 bits pero solo tenemos registros de 4 bits. En este caso queremos guardar el valor 130, la forma de dividirlo en dos partes sería así: 130 equivale en binario a: 10000010 , pero son 8 bits (8 digitos) Como tenemos solo 4 bits, lo dividimos en 2 partes: - por un lado la parte alta (los 4 bits de la izquierda) 1000 - y por el otro la parte baja (los 4 bits de la derecha) 0010 Si miras independientemente los valores, 1000 equivale a 8 en decimal, y 0010 equivale a 2 en decimal, que obviamente no es el 130 que queríamos guardar. En este caso, el máximo número que se puede almacenar con 4 bits sería 2^4 - 1 , es decir 16 valores, desde el cero hasta el quince, para poder sacar el valor real, la formula a usar es: Código:
parte_alta * 16 + parte_baja
8 * 16 + 2 = 130
Un número DWORD usa 32 bits; un Int64 usa 64 bits, justo el doble de bits, por tanto dividen el Int64 en dos DWORD, y no hay más remedio que usar la formula de marras .Es un truco muy usado en la API de windows. Saludos.
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
![]() |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Ficheros .dat y .idx | fjcg02 | Tablas planas | 11 | 29-01-2015 14:38:36 |
| Uso de ficheros CSV | ramonibk | Varios | 6 | 30-12-2004 10:28:35 |
| Ficheros *.dcu | neon | Varios | 1 | 24-08-2004 11:19:55 |
| ficheros idx y dat | User_Baja_2 | Varios | 1 | 26-05-2004 22:00:40 |
| Ficheros .dat & .idx | maro | Conexión con bases de datos | 4 | 10-02-2004 19:35:35 |
|