Título: Alguien sabe como abrir un archivo de 500 mb sin desbordamiento
Publicado por: ELGRANSOLRAC en 21 Enero 2006, 01:11 am
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...
Título: Re: Alguien sabe como abrir un archivo de 500 mb sin desbordamiento
Publicado por: ANELKAOS en 21 Enero 2006, 01:18 am
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.
Título: Re: Alguien sabe como abrir un archivo de 500 mb sin desbordamiento
Publicado por: Angellore en 26 Enero 2006, 19:02 pm
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.
Título: Re: Alguien sabe como abrir un archivo de 500 mb sin desbordamiento
Publicado por: ZuKaR en 18 Octubre 2006, 20:27 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!
|