MirshadRI Ответов: 1

Как использовать writeallbytes в sourcef ? или какие-либо другие методы копирования файла из файла ресурсов?


Public Sub DownloadDriver()
    Try
        Dim SourceF As New IO.FileStream("C:\Users\Desktop\FTP", IO.FileMode.OpenOrCreate)
        Dim DestinationF As New IO.FileStream("C:\Users\Desktop\FTP\Driver.zip", IO.FileMode.Create)
        Dim len As Long = SourceF.Length - 1
        Dim buffer(1024) As Byte
        Dim byteCFead As Integer
        While SourceF.Position < len
            byteCFead = (SourceF.Read(buffer, 0, 1024))
            DestinationF.Write(buffer, 0, byteCFead)
            DownldStatus = CInt(SourceF.Position / len * 100)
            Application.DoEvents()
        End While
        DestinationF.Flush()
        DestinationF.Close()
        SourceF.Close()
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub


Что я уже пробовал:

я просто пытаюсь добавить Источник: чтобы сделать что-то вроде WriteAllBytes из моего ресурса.Водитель

Richard MacCutchan

В чем же проблема?

1 Ответов

Рейтинг:
0

OriginalGriff

Ладно, по порядку.
Любой код, который использует приложение.DoEvents, вероятно, ошибочен с самого начала. Если это будет "блокирующий" метод, он должен быть в отдельном потоке, а не сбиваться в потоке пользовательского интерфейса. Взгляните на это Класс BackgroundWorker (System.ComponentModel) | Microsoft Docs[^] - он довольно прост в использовании и обеспечивает отчет о ходе работы обратно в поток пользовательского интерфейса, а также.

Во-вторых, вы не хотите использовать файл.WriteAllBytes в вашем потоке SourceF: это ваш входной поток, и Вы серьезно испортите все, если сделаете это.
Вы также не хотите использовать WriteAllBytes на выходе, поскольку он перезаписывает любой существующий файл: если только весь входной сигнал не записывается сразу (чего нет в этом коде), вы определенно не хотите этого.

В-третьих, это вряд ли будет работать как индикатор "прогресса загрузки": если только весь поток не был загружен в начале операции, то SourceF.Length не будет отражать фактический размер данных - поэтому загрузка его в len просто означает, что ваш вывод будет усечен рано. Все, что это будет делать, - это показывать ход операции записи, и, вероятно, не в каком-либо полезном смысле, так как кэши значительно ускорят это... если загрузка превышает 100K, она быстро превысит 100% ...

сядьте и переосмыслите то, что вы делаете: я не знаю, что делает остальная часть вашего кода или как он работает, но прогресс, вероятно, должен быть сообщен о (как правило, медленной) фактической части загрузки, а не о (как правило, быстрой) "записи на диск", как только это будет закончено.