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

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

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

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


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

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

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

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

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

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

1 Ответ

0 голосов
/ 19 декабря 2011

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

    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
...