Страница: 1 | 2 |
Вопрос: 2 вопроса про файлы и архивы
Добавлено: 02.02.07 16:38
Автор вопроса: MaAst
Доброго всем времени суток!
У меня есть 2 вопроса:
1: В какую переменную записывать файлы при загрузке их с диска? Я сейчас пихаю их в string, но помоему это бред, :), ибо последствия следующие: мизерная скорость загрузки, падение этой скорости и нехватка памяти даже чтобы загрузить 1 байт на слабых компах :'(
(для VB8 собсно)
2: Может ли кто подсказать сайты, где можно найти примеры и описание по архивации данных? примеры лучше на VB естесно :) сбственно интересуют сами способы архивации.
Ответы
Всего ответов: 17
Номер ответа: 1
Автор ответа:
MaAst
Вопросов: 15
Ответов: 63
Профиль | | #1
Добавлено: 02.02.07 16:46
Ах да.. еще 3й вопрос Куда утюжится архив в самораспаковывающихся архивах?) можно ли просто прилепить его "сзади" приложения? если да, то как? (типо чтобы просто с определенного байта считывать)
или надо в какое-то другое место приложения лепить его?
Номер ответа: 2
Автор ответа:
MaAst
Вопросов: 15
Ответов: 63
Профиль | | #2
Добавлено: 02.02.07 16:51
Ах да.. если есть какие-либо "безгеморойные" способы заархивировать/разархивировать данные в переменной, перечислите плиз
(тока главное чтобы не зависило от наличия на компьютере WinRar'а и его аналогов!)
Номер ответа: 3
Автор ответа:
Stars
Вопросов: 41
Ответов: 239
Профиль | | #3
Добавлено: 02.02.07 19:44
1) Каким способом ты читаеш данные в String, есть просто много разных способов есть быстрыеесть медленные
2) Архивирование гдето нанашем сайте и разбиралось в поиске по форуму пройдись
3) Когда липить будеш к архиву файлы то не забывай что очень большая вероятность что файлы твои будут распознаваться как зарожённыенеизвестными вирусами так как много вирусов заражающих EXE так работают.
4)На сайте гдето есть поищи пример был покрайней мере както видел даже вроде тамможнобыло делать самораспоковывающиеся файлы
Номер ответа: 4
Автор ответа:
Stars
Вопросов: 41
Ответов: 239
Профиль | | #4
Добавлено: 02.02.07 19:44
1) Каким способом ты читаеш данные в String, есть просто много разных способов есть быстрыеесть медленные
2) Архивирование гдето нанашем сайте и разбиралось в поиске по форуму пройдись
3) Когда липить будеш к архиву файлы то не забывай что очень большая вероятность что файлы твои будут распознаваться как зарожённыенеизвестными вирусами так как много вирусов заражающих EXE так работают.
4)На сайте гдето есть поищи пример был покрайней мере както видел даже вроде тамможнобыло делать самораспоковывающиеся файлы
Номер ответа: 5
Автор ответа:
Alexandr.R
Вопросов: 9
Ответов: 115
Web-сайт:
Профиль | | #5
Добавлено: 02.02.07 19:51
Option Explicit On
Imports System.IO
Imports System.IO.Compression
Public Class ZipUtil
Public Shared Sub CompressFile(ByVal sourceFile As String, ByVal destinationFile As String)
' make sure the source file is there
If File.Exists(sourceFile) = False Then
Throw New FileNotFoundException
End If
' Create the streams and byte arrays needed
Dim buffer As Byte() = Nothing
Dim sourceStream As FileStream = Nothing
Dim destinationStream As FileStream = Nothing
Dim compressedStream As GZipStream = Nothing
Try
' Read the bytes from the source file into a byte array
sourceStream = New FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read)
' Read the source stream values into the buffer
buffer = New Byte(CInt(sourceStream.Length)) {}
Dim checkCounter As Integer = sourceStream.Read(buffer, 0, buffer.Length)
' Open the FileStream to write to
destinationStream = New FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write)
' Create a compression stream pointing to the destiantion stream
compressedStream = New GZipStream(destinationStream, CompressionMode.Compress, True)
'Now write the compressed data to the destination file
compressedStream.Write(buffer, 0, buffer.Length)
Catch ex As ApplicationException
MessageBox.Show(ex.Message, "An Error occured during compression", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
' Make sure we allways close all streams
If Not (sourceStream Is Nothing) Then
sourceStream.Close()
End If
If Not (compressedStream Is Nothing) Then
compressedStream.Close()
End If
If Not (destinationStream Is Nothing) Then
destinationStream.Close()
End If
End Try
End Sub
Public Shared Sub DecompressFile(ByVal sourceFile As String, ByVal destinationFile As String)
' make sure the source file is there
If File.Exists(sourceFile) = False Then
Throw New FileNotFoundException
End If
' Create the streams and byte arrays needed
Dim sourceStream As FileStream = Nothing
Dim destinationStream As FileStream = Nothing
Dim decompressedStream As GZipStream = Nothing
Dim quartetBuffer As Byte() = Nothing
Try
' Read in the compressed source stream
sourceStream = New FileStream(sourceFile, FileMode.Open)
' Create a compression stream pointing to the destiantion stream
decompressedStream = New GZipStream(sourceStream, CompressionMode.Decompress, True)
' Read the footer to determine the length of the destiantion file
quartetBuffer = New Byte(4) {}
Dim position As Integer = CType(sourceStream.Length, Integer) - 4
sourceStream.Position = position
sourceStream.Read(quartetBuffer, 0, 4)
sourceStream.Position = 0
Dim checkLength As Integer = BitConverter.ToInt32(quartetBuffer, 0)
Dim buffer(checkLength + 100) As Byte
Dim offset As Integer = 0
Dim total As Integer = 0
' Read the compressed data into the buffer
While True
Dim bytesRead As Integer = decompressedStream.Read(buffer, offset, 100)
If bytesRead = 0 Then
Exit While
End If
offset += bytesRead
total += bytesRead
End While
' Now write everything to the destination file
destinationStream = New FileStream(destinationFile, FileMode.Create)
destinationStream.Write(buffer, 0, total)
' and flush everyhting to clean out the buffer
destinationStream.Flush()
Catch ex As ApplicationException
MessageBox.Show(ex.Message, "An Error occured during compression", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
' Make sure we allways close all streams
If Not (sourceStream Is Nothing) Then
sourceStream.Close()
End If
If Not (decompressedStream Is Nothing) Then
decompressedStream.Close()
End If
If Not (destinationStream Is Nothing) Then
destinationStream.Close()
End If
End Try
End Sub
End Class
Номер ответа: 6
Автор ответа:
MaAst
Вопросов: 15
Ответов: 63
Профиль | | #6
Добавлено: 03.02.07 00:10
считываю в string тем способом какой знаю)
FileOpen(FileNum, ppp, OpenMode.Binary)
'тут всякая ерунда...
'тут либо for, либо do, либо while
FileGet(FileNum, CurByte)
'тут всякая ерунда...
File Close(FileNum)
остальных способов не помню...) давно под VB не программил)
Номер ответа: 7
Автор ответа:
MaAst
Вопросов: 15
Ответов: 63
Профиль | | #7
Добавлено: 03.02.07 00:13
собсно переменная типа byte (CurByte) и прибавляется к переменной типа string...
Номер ответа: 8
Автор ответа:
MaAst
Вопросов: 15
Ответов: 63
Профиль | | #8
Добавлено: 03.02.07 00:15
в виде символа конечно...
Номер ответа: 9
Автор ответа:
Viper
ICQ: 249094859
Вопросов: 0
Ответов: 310
Профиль | | #9
Добавлено: 03.02.07 08:12
Во-первых зацени тот факт, что FileGet может считывать не по байту, а строку целиком (и не только строку). Во-вторых зацени такие классы, как StringReader и StreamReader. Ну и, в третьих, есть и другие типы данных, которые можно прочитать из файла, посему, заценивай BinaryReader.
Номер ответа: 10
Автор ответа:
MaAst
Вопросов: 15
Ответов: 63
Профиль | | #10
Добавлено: 03.02.07 14:32
построчно считывать пробовал, при этом обнаружил что бывают случаи, когда попадает первый/последний байт, вобщем это только для текстовых файлов подходит...
вобщем буду заценивать BinaryReader...)
Номер ответа: 11
Автор ответа:
Stars
Вопросов: 41
Ответов: 239
Профиль | | #11
Добавлено: 03.02.07 14:41
Самые быстрые методы чтения и записи на вой взгяд через FSO
Номер ответа: 12
Автор ответа:
MaAst
Вопросов: 15
Ответов: 63
Профиль | | #12
Добавлено: 03.02.07 15:46
так... заценил BinaryReader... читает быстрее намного конечно одно но... все равно, если пихать в стринг скорость сильно падает после загрузки эдак 200кб, которая проходит за секунду, еле грузит
вот в какого типа переменную лучше загружать файл? и чтобы потом можно было его считывать откуда хотелось и по сколько хотелось...
Номер ответа: 13
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #13
Добавлено: 03.02.07 16:07
показывай весь код
BinaryReader - для лузеров, реальные кенты юзают Stream.
Вообще чтоб достичь скорости 200 кб/с, нужно применять сложные механизмы деоптимизации, я бы хотел на это взглянуть.
Номер ответа: 14
Автор ответа:
MaAst
Вопросов: 15
Ответов: 63
Профиль | | #14
Добавлено: 03.02.07 16:59
ну я образно сказал "за секунду"
ниже код с "пробной" формы...
Dim huhu As Object
Try
Dim im As Long
Button1.Enabled = False
Button2.Enabled = False
Dim fs As New System.IO.FileStream(URL.Text, System.IO.FileMode.Open)
Dim br As New System.IO.BinaryReader(fs)
Dim downloaded As Integer = 0
Dim value As Byte
Dim pp As Long
pp = br.BaseStream.Length
Label4.Text = "Всего: " & pp & " Байт"
Dim mm As Long
Do
value = br.ReadByte
If value = -1 Then Exit Do
downloaded = downloaded + 1
im = downloaded.ToString
If im > mm + 1024 Then
mm = downloaded.ToString
Label3.Text = "Получено: " & mm & " Байт"
ProgressBar1.Value = mm / pp * 100
End If
Application.DoEvents()
huhu = huhu & Chr(value)
Loop
Button1.Enabled = True
Button2.Enabled = True
Catch ex As Exception
Button1.Enabled = True
Button2.Enabled = True
End Try
Диагноз... йа лузер
Номер ответа: 15
Автор ответа:
MaAst
Вопросов: 15
Ответов: 63
Профиль | | #15
Добавлено: 03.02.07 17:02
ах да... всесто As Object был String, это я просто проверял что изменится...)