BlockRead
Adam Boduch
Parametr F musi być typu amorficznego - File. Parametr Buf może być dowolnego typu, do niego zostaną przpisane dane odczytane z pliku (bufor). Count określa ilość danych odcztytywanych i przypisywanych do bufora. Ostatni parametr - AmtTransfered określa ilość rzeczywiście odczytanych danych - ta wartość powinna być równa tej z parametru Count. Nie zawsze tak jest o czym przekonasz się w zaprezentowanym poniżej przykładzie. Program realizuje kopiowanie dwóch plików, kawałek po kawałku w porcjach po 1024 bajty. Będziemy więc w pętli czytali kolejne porcje danych, jeżeli wartość AmtTransfered jest mniejsza niż Count oznacza to, że odczytaliśmy plik do końca. Spójrz na poniższy kod źródłowy:
program Foo;
{$APPTYPE CONSOLE}
uses
System;
var
Src, Dst : File;
BytesRead, BytesWrite : Integer;
TotalBytes : Integer = 0;
Buff : array[0..1024] of Byte;
begin
AssignFile(Src, 'C:\Aplikacja.exe');
try
Reset(Src, 1);
AssignFile(Dst, 'C:\Aplikacja.exe.bak');
try
ReWrite(Dst, 1);
repeat
BlockRead(Src, Buff, 1024, BytesRead);
BlockWrite(Dst, Buff, BytesRead, BytesWrite);
// zliczanie całkowitej ilości odczytanych bajtów
TotalBytes := TotalBytes + BytesWrite;
until (BytesRead = 0) or (BytesWrite <> BytesRead);
finally
CloseFile(Dst);
end;
finally
CloseFile(Src);
end;
Writeln('Skopiowano... całkowity rozmiar pliku: ', TotalBytes, ' bajtów');
Readln;
end.
Na samym początku, program otwiera plik źródłowy oraz tworzy plik docelowy. W obu przypadkach określiliśmy rozmiar rekordu na poziomie 1 bajtu (w procedurach Reset oraz Rewrite). Następnie w pętli kopiujemy kolejne porcje danych, które zostaną zapisane do tablicy Buff. Tak odczytane dane zapisujemy do pliku (kopii) przy pomocy procedury BlockWrite. Po skopiowanie pliku (warunek zakończenia pętli: BytesRead równe zero), wyświetlony zostanie komunikat.
Zobacz też: