Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: gvin.net
 Профиль | | #5
Добавлено: 02.02.07 19:51
Option Strict On
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, это я просто проверял что изменится...)

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам