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