Delphi Определяет размер файла в режиме реального времени - PullRequest
0 голосов
/ 01 июля 2011

Возможно ли в Delphi определить размер файла при копировании? Я получаю уведомление, когда файл сначала копируется в папку, но мне нужно дождаться завершения копирования, прежде чем я смогу обработать файл.

Я использовал JclFileUtils.GetSizeOfFile(Filename), но это дает мне «ожидаемый» размер файла, а не текущий размер файла.

С уважением, Питер

Ответы [ 3 ]

1 голос
/ 05 июля 2011

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

function IsFileInUse(Filename: string; var ResultMessage: string): boolean;
var
  Stream: TFileStream;
begin
  Result := True;
  ResultMessage := '';
  try
    Stream := TFileStream.Create(Filename, fmOpenRead or fmShareDenyWrite);
    try
      Result := False;
    finally
      FreeAndNil(Stream);
    end;

  Except on E: Exception do
    ResultMessage := 'IsFileInUse: ' + E.Message
  end;
end;

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

0 голосов
/ 01 июля 2011

Если у вас есть контроль над процессом копирования файла, проще всего сделать так, чтобы процедура копирования создала файл, используя временное имя файла, и когда это будет сделано, переименуйте его, чтобы исправить имя файла.Таким образом, вы можете использовать мониторинг папок Windows для отслеживания переименования (JCL содержит компонент, который поможет с этим, но не уверен насчет имени здесь).Когда ваш код запускается, вы уверены, что другая сторона закончила запись файла.Простой трюк, который я использовал, состоял в том, чтобы в процессе копирования создавались новые файлы с расширением $$$.Мой код все еще запускался для тех, но я игнорировал их, пока они не были переименованы в их правильное имя файла.

Надеюсь, это поможет.

0 голосов
/ 01 июля 2011

Это зависит от метода, который используется функцией копирования. Большинство методов копирования сначала выделяют дисковое пространство, прежде чем начать копирование файла. Таким образом, если вы хотите скопировать файл размером 4 ГБ, система начинает с создания файла со случайными данными в общей сложности 4 ГБ. (Что делается молниеносно, между прочим.) Затем он копирует сами данные, но размер файла уже соответствует ожидаемому. Преимуществом этого является то, что системный администратор может проверить, достаточно ли места на диске для фактического копирования данных.

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

...