Alguien sabe como abrir un archivo de 500 mb sin desbordamiento

Iniciado por ELGRANSOLRAC, 21 Enero 2006, 01:11 AM

0 Miembros y 2 Visitantes están viendo este tema.

ELGRANSOLRAC

Hola:
Estoy haciendo un brograma para abrir archivos de cualquier extension,pero solo puedo abrir archivos de poco tamaño ¿Alguien sabe como abrir un archivo de 400 o 500 mb sin desbordarse? Gracias quien pueda ayudarme o tenga algo de informacion se lo agradeceria..Gracias a todos..

Este es mi codigo,utilizo un Richtextbox y un commonDialogo.

Private Sub Command1_Click()
Dim datos As String * 5000

CdlBuscar.InitDir = App.Path
CdlBuscar.Filter = "Archivos" & "(*.*)|*.*|"
    CdlBuscar.ShowOpen
    If Not CdlBuscar.FileName = "" Then
        panel.FileName = CdlBuscar.FileName
    End If
   
   
   
   
End Sub


Gracias a todos...

ANELKAOS

utiliza memoria dinámica (creo que me acaba de patinar la neurona con C por llevar sin usar VB mucho tiempo pero por si acaso lo digo  :P) o variables de tipo variant

Puedes llamar a otro programa para que lo abra, por ejemplo el wmplayer.exe o iexplore.exe.

1Saludo.

Angellore

Hola.
Como dijo ANELKAOS, lo mejor es utilizar la memoria para leer el archivo.

Escribí una función que lee un archivo grande a la memoria y devuelve la dirección base en donde se encuentra, para luego poder leerlo utilizando ReadProcessMemory y modificarlo con WriteProcessMemory. Esta función puede servir para guardar un archivo grande con un par de modificaciones leves.

Las funciones que utilizo se encuentran en la biblioteca win.tlb que encontré en este mismo foro. Sólo hay que agregar como referencia win.tlb y funciona.


Option Explicit

Function ReadLargeFile(ByVal Filename As String) As Long
        Dim lDataChunkSize&
        Dim lNumberOfChunks&
        Dim hFile&, lFileLen&
        Dim lMemOffset&, lReadLen&
        Dim hMem&, i&, r&

  ' Abre el archivo para lectura.
  '
  hFile = CreateFile(Filename, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, _
                     0&, OPEN_EXISTING, 0&, 0&)
 
  If hFile = INVALID_HANDLE_VALUE Then Exit Function
 
  ' Se obtiene el tamaño del archivo.
  '
  lFileLen = GetFileSize(hFile, 0&)
 
  lDataChunkSize = 1024& * 1024&  ' Se leerá de a trozos de 1 MB
 
  ' Si calcula en cuántas veces se leerá el archivo.
  '
  lNumberOfChunks = lFileLen \ lDataChunkSize
   
  If lNumberOfChunks = 0 Then
    lNumberOfChunks = 1 ' El archivo en menor a 1 MB.
  Else
    ' Calcula la longitud de los datos de la última
    ' sección del archivo, que seguramente es menor
    ' a 1 Megabyte.
    '
    If (lFileLen Mod lDataChunkSize) > 0 Then lNumberOfChunks = lNumberOfChunks + 1
  End If
 
  ' Asigna memoria para leer el archivo.
  '
  hMem = VirtualAlloc(0&, lFileLen, MEM_COMMIT, PAGE_READWRITE)
 
  If hMem = 0 Then GoTo FailRead
 
  For i = 1 To lNumberOfChunks
    ' Se verifica si es la última sección del archivo o no.
    '
    If i < lNumberOfChunks Then
      lReadLen = lDataChunkSize
    Else
      lReadLen = lFileLen Mod lDataChunkSize
    End If
   
    ' Lee el trozo del archivo a la memoria.
    '
    r = ReadFile(hFile, ByVal hMem + lMemOffset, lReadLen, 0, ByVal 0&)
   
    If r = 0 Then GoTo FailRead
   
    ' Pasa al siguiente trozo de datos.
    '
    lMemOffset = lMemOffset + lReadLen

    DoEvents
  Next

FailRead:
  If Err.LastDllError <> ERROR_SUCCESS Then
    ' Libera la memoria si no se pudo leer el archivo.
    '
    Debug.Print GetSysErr(Err.LastDllError)
    r = VirtualFree(hMem, 0, MEM_RELEASE)
  Else
    ' Devuelve el puntero al inicio del archivo en memoria.
    '
    ReadLargeFile = hMem
  End If
 
  ' Cierra el archivo.
  '
  r = CloseHandle(hFile)

End Function

Function GetSysErr(ByVal ErrNumber As Long) As String
        Dim sBuffer$, lLen&

  sBuffer = String$(1024, 0)
 
  lLen = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0&, ErrNumber, 0&, ByVal sBuffer, 1024, ByVal 0&)
 
  If lLen Then
    sBuffer = Left$(sBuffer, lLen)
  End If
 
  GetSysErr = sBuffer
End Function


Saludos.
Angellore.

ZuKaR

Cita de: Angellore en 26 Enero 2006, 19:02 PM
Las funciones que utilizo se encuentran en la biblioteca win.tlb que encontré en este mismo foro.

Buenas, aprovecho para saludar a todo el foro

Quisiera que me indicaráis de dónde descargar la librería win.tlb dado que no la he encontrado por el foro.

Gracias!