Visual Basic - SetFilePointer

Life is soft - evento anual de software empresarial
   
Vista:

SetFilePointer

Publicado por pablo ramirez (3 intervenciones) el 10/07/2008 13:45:49
Hola, estoy utilizando la instruccionpara ller un archivo plano de mas de 2 Gb, pero cuando el valor de la variable posicion sobre pasa el tipo long saca un error de desbordamiento aunque la variable este definida como currency, alguien me puede ayudar

Muchas Gracias...
SetFilePointer SetFilePointer LonPlanoOriginal, Posicion, 0, 2
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:SetFilePointer

Publicado por igor (633 intervenciones) el 10/07/2008 17:32:24
Vas por buen camino, pero no acabas de hacerlo bien.

Yo me he encontrado con el mismo problema y le he dado esta solución:

Public Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Currency

Dim Desplazamiento As Currency
Dim Desplazamiento1 As Currency
Dim Byte1, Byte2 As Long

Byte2 = Int(Desplazamiento / 4294967296#)
Desplazamiento = Desplazamiento - (Byte2 * 4294967296#)
Desplazamiento1 = Desplazamiento
If Desplazamiento > &H7FFFFFFF Then
Desplazamiento1 = Desplazamiento - 2147483648#
End If
Byte1 = Sector1
If Sector > 0 Then
Resultado = SetFilePointer(hDrive, Byte1, Byte2, FILE_BEGIN)
If Byte1 <> Sector Then
Resultado = SetFilePointer(hDrive, &H80000000, 0, FILE_BEGIN)
End If
End If

Es un poco chapuza, pero con la limitación de vb6 no se puede hacer la llamada como es debido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SetFilePointer

Publicado por Pablo Ramirez (1 intervención) el 10/07/2008 21:50:30
Oye, disculpa pero no entiendo lo que escribes, mira, yo lo que pretendo hacer es algo como lo siguiente.

Private Sub cmdReemplazoSeek_Click()
Dim intCont As Double
Dim LonPlanoOriginal As Integer
Dim strCadena As String
Dim Posicion As Currency
Dim Valor As Currency

Dim FechIni As Date
Dim FechFin As Date

Posicion = 1

LonPlanoOriginal = FreeFile
Open Me.Text1.Text For Input As #LonPlanoOriginal

FechIni = Now
Do While Not EOF(LonPlanoOriginal)
Line Input #LonPlanoOriginal, strCadena
SetFilePointer LonPlanoOriginal, Posicion, ByVal 0&, 1
Posicion = Posicion + Len(strCadena)
Loop
Close #LonPlanoOriginal
FechFin = Now

MsgBox "Termino el proceso con : " & Format(Posicion, "#,#00.00") & " Bytes, en " & DateDiff("s", FechIni, FechFin) & " Segundos"
End Sub

La formar en la que declaro la función es la siguiente

Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Currency

Siempre la aplicación saca el error de Overflow en la siguiente linea.
SetFilePointer LonPlanoOriginal, Posicion, ByVal 0&, 1

Muchas Gracias ......
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SetFilePointer

Publicado por Pablo Ramirez (3 intervenciones) el 11/07/2008 13:06:47
Oye, disculpa pero no entiendo lo que escribes, mira, yo lo que pretendo hacer es algo como lo siguiente.

Private Sub cmdReemplazoSeek_Click()
Dim intCont As Double
Dim LonPlanoOriginal As Integer
Dim strCadena As String
Dim Posicion As Currency
Dim Valor As Currency

Dim FechIni As Date
Dim FechFin As Date

Posicion = 1

LonPlanoOriginal = FreeFile
Open Me.Text1.Text For Input As #LonPlanoOriginal

FechIni = Now
Do While Not EOF(LonPlanoOriginal)
Line Input #LonPlanoOriginal, strCadena
SetFilePointer LonPlanoOriginal, Posicion, ByVal 0&, 1
Posicion = Posicion + Len(strCadena)
Loop
Close #LonPlanoOriginal
FechFin = Now

MsgBox "Termino el proceso con : " & Format(Posicion, "#,#00.00") & " Bytes, en " & DateDiff("s", FechIni, FechFin) & " Segundos"
End Sub

La formar en la que declaro la función es la siguiente

Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Currency

Siempre la aplicación saca el error de Overflow en la siguiente linea.
SetFilePointer LonPlanoOriginal, Posicion, ByVal 0&, 1

Muchas Gracias ......
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SetFilePointer

Publicado por igor (633 intervenciones) el 11/07/2008 18:52:45
La cosa está clara, si utilizamos long, y además con signo, todo lo que supere 2^31 desbordará a negativo, generando un error.

Además tu estás utilizando una variable currency pasando el valor a una función que está bien claro que utiliza longs, esto no se puede hacer.

La API de windows no está diseñada pensando en vb6, sería más facil en C++.

Para desplazamientos superiores a 2^32 puedes usar lpDistanceToMoveHigh junto con lDistanceToMove para formar un long de 64bits.

El problema es que vb6 no está preparado para manejar este tamaño, con lo que tenemos que apañarnoslas para evitar desbordamientos.

Yo lo que hago es poner la parte alta de un currency en lpDistanceToMoveHigh.

La parte baja la compruebo para ver si es mayor que 2^31, haciendo 2 llamadas a setfilepointer con el indicador FILE_CURRENT (=1) que desplaza el puntero a partir de la posición actual.

Si no entiendes todo esto es que no estás preparado para hacer llamadas API, te recomiendo que utilices las funciones propias de visual basic.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar