FileInfo.Length всегда показывает общий размер файлов, а не фактический текущий размер

Я пытаюсь отслеживать ход выполнения процедуры копирования большого файла (без самостоятельного копирования байтов данных вручную) с помощью команды File.Copy([FileName]).

Итак, что я пытаюсь сделать, это получить длину копируемого файла и сравнить ее с длиной целевого файла. Это дало бы мне хорошее представление о ходе копирования.

Единственная проблема заключается в том, что свойство FileInfo.Length целевого файла возвращает общий размер копируемого файла, а не фактический размер файла на диске. Есть ли другой способ получить эти данные? Спасибо, Крис



EDIT (перемещено снизу - было отправлено OP как ответ)

Я посмотрел ссылку, и это совсем не то, что я хочу. Я хочу показать ход копирования файла только в том случае, если файл большой (копирование занимает более 3 секунд).

Большинство файлов занимает около 1/4 секунды, но есть несколько файлов размером около 600+ МБ, для копирования которых по сети требуется некоторое время.

Все, что мне нужно, это как получить фактический размер частично скопированного файла в целевом каталоге.

(Поскольку у меня здесь нет учетной записи, я не смог опубликовать ответ на ваш ответ на мой вопрос, поэтому он отображается как ответ, хотя это не так.)

Спасибо, Крис


person buzzluck68    schedule 25.08.2011    source источник
comment
дублировать stackoverflow.com/questions/187768/   -  person Massimiliano Peluso    schedule 25.08.2011


Ответы (1)


Вы можете выполнить операцию копирования самостоятельно, используя потоки, и отобразить прогресс:

    Const SOURCE_FILEPATH = "C:\TEMP\GameOfThrones.png"
    Const DEST_FILEPATH = "C:\GameOfThrones.png"

    Const BUFFER_SIZE As Integer = 32767
    If System.IO.File.Exists(DEST_FILEPATH) Then System.IO.File.Delete(DEST_FILEPATH)
    Using inStream As New System.IO.FileStream(SOURCE_FILEPATH, IO.FileMode.Open, IO.FileAccess.Read)
        Dim offset As Integer = 0
        Dim count As Integer = BUFFER_SIZE
        Using outStream As New System.IO.FileStream(DEST_FILEPATH, IO.FileMode.Create, IO.FileAccess.Write)
            Do While offset + count <= inStream.Length AndAlso offset <> inStream.Length
                Dim buffer(count) As Byte
                inStream.Seek(offset, IO.SeekOrigin.Begin)
                inStream.Read(buffer, 0, buffer.Length - 1)
                outStream.Seek(outStream.Length, IO.SeekOrigin.Begin)
                outStream.Write(buffer, 0, buffer.Length - 1)
                offset += count
                If count + offset > inStream.Length Then
                    count = inStream.Length - offset
                Else
                    count = BUFFER_SIZE
                End If
                System.Console.WriteLine((offset / inStream.Length) * 100 & "% complete")
            Loop
        End Using
    End Using
person codechurn    schedule 19.12.2011