Domingo 15 de Diciembre de 2024, 12:57
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Problema con SetFilePointer
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Problema con SetFilePointer (Leído 2434 veces)
atapuerkasman
Nuevo Miembro
Mensajes: 5
Problema con SetFilePointer
«
en:
Jueves 11 de Junio de 2009, 19:28 »
0
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
Tweet
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Problema con SetFilePointer
«
Respuesta #1 en:
Jueves 11 de Junio de 2009, 19:40 »
0
Probalo pero estoy casi seguro que es asi:
Código: Text
LONG highDistance = 0x12;
SetFilePointer(hFile, 0x2394CACA, &highDistance, FILE_BEGIN);
Cualquier cosa usa esta funcion que viene en la MSDN:
Código: Text
__int64 myFileSeek (HANDLE hf, __int64 distance, DWORD MoveMethod)
{
LARGE_INTEGER li;
li.QuadPart = distance;
li.LowPart = SetFilePointer (hf,
li.LowPart,
&li.HighPart,
MoveMethod);
if (li.LowPart == INVALID_SET_FILE_POINTER && GetLastError()
!= NO_ERROR)
{
li.QuadPart = -1;
}
return li.QuadPart;
}
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
atapuerkasman
Nuevo Miembro
Mensajes: 5
Re: Problema con SetFilePointer
«
Respuesta #2 en:
Viernes 12 de Junio de 2009, 12:03 »
0
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.
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Problema con SetFilePointer
«
Respuesta #3 en:
Viernes 12 de Junio de 2009, 12:49 »
0
De nadas
Igual despues puse las dos juntas y lo depure para comprobar que pasaban los mismos parametros
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
atapuerkasman
Nuevo Miembro
Mensajes: 5
Re: Problema con SetFilePointer
«
Respuesta #4 en:
Jueves 18 de Junio de 2009, 10:48 »
0
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!!!!
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Problema con SetFilePointer
«
Respuesta #5 en:
Jueves 18 de Junio de 2009, 11:05 »
0
¿Como? En bytes ya esta dado, en 4 (un DWORD) u 8 (dos DWORDs) segun sea la necesidad.
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.
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
atapuerkasman
Nuevo Miembro
Mensajes: 5
Re: Problema con SetFilePointer
«
Respuesta #6 en:
Viernes 19 de Junio de 2009, 13:08 »
0
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
a mi lo que se me a ocurrido es:
Código: C++
DWORD posicion
;
posicion
=
SetFilePointer
(
hFile,
0
,
0
, FILE_CURRENT
)
;
posicion
=
posicion
-
3
;
SetFilePointer
(
hFile, posicion,
0
, FILE_BEGIN
)
;
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)??????
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Problema con SetFilePointer
«
Respuesta #7 en:
Viernes 19 de Junio de 2009, 13:16 »
0
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
.
Código: Text
SetFilePointer(hFile, -3, 0, FILE_CURRENT);
Sino, para hacerlo bien:
Código: Text
LARGE_INTEGER dontMove;
dontMove.QuadPart = 0;
LARGE_INTEGER currentPos;
SetFilePointerEx(hFile, dontMove, ¤tPos, FILE_CURRENT);
currentPos.QuadPart -= 3;
SetFilePointerEx(hFile, currentPos, 0, FILE_CURRENT);
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
atapuerkasman
Nuevo Miembro
Mensajes: 5
Re: Problema con SetFilePointer
«
Respuesta #8 en:
Viernes 19 de Junio de 2009, 14:00 »
0
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
Muchas gracias por las respuestas
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Problema con SetFilePointer
«
Respuesta #9 en:
Viernes 19 de Junio de 2009, 14:07 »
0
Es mucho trabajo al pedo, -5 es ese numero exactamente
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Problema con SetFilePointer