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

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

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

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



РЕДАКТИРОВАТЬ (перемещено снизу - было представлено как ответ OP)

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

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

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

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

Спасибо Крис

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
Другие вопросы по тегам