Programación General => C/C++ => Mensaje iniciado por: atapuerkasman en Jueves 11 de Junio de 2009, 19:28
Título: Problema con SetFilePointer
Publicado por: atapuerkasman en Jueves 11 de Junio de 2009, 19:28
Saludos!!!Soy nuevo en esta página y me gustaría saber si alguien me puede ayudar con un pequeño problema que tengo.
Estoy trabajando utilizando la funcion de SetFilePointer para desplazar el puntero en archivos. Esta es la declaración de la función:
Código: C++
DWORD SetFilePointer( HANDLE hFile, LONG lDistanceToMove,
LPLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);
Hasta ahora no había encontrado ningún problema con ella, pero tengo que hacer un desplazamiento de mas de 4gb y no se como utilizar lpDistanceToMoveHigh. Como no se si me estoy explicando voy a poner un ejemplo:
Me gustaria realizar un desplazamiento de 0x122394CACA con respecto al inicio. Suponiendo el siguiente manejador de fichero HANDLE fFile, como se haria????????alguien me puede exar una mano???
Muchas gracias
Título: Re: Problema con SetFilePointer
Publicado por: Eternal Idol en Jueves 11 de Junio de 2009, 19:40
if (li.LowPart == INVALID_SET_FILE_POINTER && GetLastError()
!= NO_ERROR)
{
li.QuadPart = -1;
}
return li.QuadPart;
}
Título: Re: Problema con SetFilePointer
Publicado por: atapuerkasman en Viernes 12 de Junio de 2009, 12:03
Muchas gracias!!!!! La 1ª solución que me diste me vale. El problema lo tenía en que no sabía como tratar un desplazamiento tan grande y había leido el comportamiento de la función pero no me acababa de quedar claro como se implementaría.
Ahora es bastante lógico, dado un desplazamiento grande las 8 primeras cifras se corresponden a 32 bytes (2^8=256 bits, 256/8=32 bytes) y el resto se pasa con la parte alta. :good:
Título: Re: Problema con SetFilePointer
Publicado por: Eternal Idol en Viernes 12 de Junio de 2009, 12:49
De nadas B) Igual despues puse las dos juntas y lo depure para comprobar que pasaban los mismos parametros :good:
Título: Re: Problema con SetFilePointer
Publicado por: atapuerkasman en Jueves 18 de Junio de 2009, 10:48
Otra pregunta, esta vez por curiosidad. Si en lugar de pasarte el desplazamiento en hexadecimal te lo dan en bytes???? por ejemplo te dicen que el tamaño del archivo es superior a los 4Gb, y un desplazamiento mayor de 2,2Gb(redondeando xDDD). ¿eso como se implementaría? utilizando el SetFilePointer por ejemplo, con un desplazamiento de: 3938530847
Muchas gracias!!!!
Título: Re: Problema con SetFilePointer
Publicado por: Eternal Idol en Jueves 18 de Junio de 2009, 11:05
¿Como? En bytes ya esta dado, en 4 (un DWORD) u 8 (dos DWORDs) segun sea la necesidad. Hexadecimal (http://es.wikipedia.org/wiki/Sistema_hexadecimal).
Ese desplazamiento que mencionas no es de mas de 4GB asi que seria con un solo parametro ... si lo que querias eran aprox. 6.2GB entonces seria asi: 0x1EAC1361E. Si te das cuenta el primer DWORD es equivalente a 3938530847=EAC1361F.
Título: Re: Problema con SetFilePointer
Publicado por: atapuerkasman en Viernes 19 de Junio de 2009, 13:08
Una última consulta, he encontrado un ejercicio propuesto cuyo enunciado es básicamente este:
un fichero de mas de 4Gb cuyo descriptor es HANDLE hFile, en win32. El puntero está colocado en alguna parte que desconocemos, y queremos colorcarlos 3 posiciones más atras de la actual
El problema lo encuentro, en que si tengo que usar la parte alta para meter el desplazamiento, como se podría hacer????? o bastaría con poner en el 2º parametro un -3(ya que al ser de tipo LONG permite enteros con signo)??????
Título: Re: Problema con SetFilePointer
Publicado por: Eternal Idol en Viernes 19 de Junio de 2009, 13:16
En teoria: If lpDistanceToMoveHigh is NULL, lDistanceToMove is a 32-bit signed value. A positive value for lDistanceToMove moves the file pointer forward in the file, and a negative value moves the file pointer back.
Título: Re: Problema con SetFilePointer
Publicado por: atapuerkasman en Viernes 19 de Junio de 2009, 14:00
Muchas gracias, pero a nosotros nos pedían hacerlo con la función SetFilePointer. Ya me he enterado de como se haría. si por ejemplo quieres ir 5 posiciones para atras respecto al puntero seria:
poner el 5 en binario:
0000 0000 0000 0000 0000 0000 0000 0101
se complementa: 1111 1111 1111 1111 1111 1111 1111 1010
y se le suma 1:
1111 1111 1111 1111 1111 1111 1111 1011
asi obtenemos el -5. Luego ya se le pasa normal en la parte baja...ej: 0xFFFFFFFB
:good: Muchas gracias por las respuestas
Título: Re: Problema con SetFilePointer
Publicado por: Eternal Idol en Viernes 19 de Junio de 2009, 14:07
Es mucho trabajo al pedo, -5 es ese numero exactamente ^_^