• Lunes 29 de Abril de 2024, 07:20

Autor Tema:  Problema con SetFilePointer  (Leído 2316 veces)

atapuerkasman

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
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++
  1. DWORD SetFilePointer( HANDLE hFile, LONG lDistanceToMove,
  2.                       LPLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);
  3.  

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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
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
  1. LONG highDistance = 0x12;
  2. SetFilePointer(hFile, 0x2394CACA, &highDistance, FILE_BEGIN);
  3.  

Cualquier cosa usa esta funcion que viene en la MSDN:

Código: Text
  1. __int64 myFileSeek (HANDLE hf, __int64 distance, DWORD MoveMethod)
  2. {
  3.    LARGE_INTEGER li;
  4.  
  5.    li.QuadPart = distance;
  6.  
  7.    li.LowPart = SetFilePointer (hf,
  8.                                 li.LowPart,
  9.                                 &li.HighPart,
  10.                                 MoveMethod);
  11.  
  12.    if (li.LowPart == INVALID_SET_FILE_POINTER && GetLastError()
  13.        != NO_ERROR)
  14.    {
  15.       li.QuadPart = -1;
  16.    }
  17.  
  18.    return li.QuadPart;
  19. }
  20.  

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
    • Ver Perfil
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. :good:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema con SetFilePointer
« Respuesta #3 en: Viernes 12 de Junio de 2009, 12:49 »
0
De nadas  B) Igual despues puse las dos juntas y lo depure para comprobar que pasaban los mismos parametros  :good:

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
    • Ver Perfil
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: ar
    • Ver Perfil
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
    • Ver Perfil
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++
  1. DWORD posicion;
  2. posicion=SetFilePointer(hFile, 0, 0, FILE_CURRENT);
  3. posicion=posicion-3;
  4. SetFilePointer(hFile, posicion, 0, FILE_BEGIN);
  5.  

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: ar
    • Ver Perfil
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
  1. SetFilePointer(hFile, -3, 0, FILE_CURRENT);
  2.  

Sino, para hacerlo bien:

Código: Text
  1. LARGE_INTEGER dontMove;
  2. dontMove.QuadPart = 0;
  3. LARGE_INTEGER currentPos;
  4. SetFilePointerEx(hFile, dontMove, &currentPos, FILE_CURRENT);
  5. currentPos.QuadPart -= 3;
  6. SetFilePointerEx(hFile, currentPos, 0, FILE_CURRENT);
  7.  

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
    • Ver Perfil
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

 :good:  Muchas gracias por las respuestas

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
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.