[ Passwd @ 06.04.2005. 16:41 ] @
Kako napravit program koji ce skopirati jednu datoteku na neko drugo mjesto na disku?
[ Srki_82 @ 06.04.2005. 16:56 ] @
program bi izgledao otprilike ovako
Code:
const
  BuffSize = 32 * 1024; // 32 kb

var
  SrcFile, DestFile: File;
  Buff: Pointer;
  R: Word;
  SrcName, DestName: String;

begin
  // Ne znam kako zelis da dodjes do imena fajlova
  // taj deo napisi sam
  // mozes korisiti ParamStr promenljivu za to
  GetMem(Buff, BuffSize);
  Assign(SrcFile, SrcName);
  Assign(DestFile, DestName);
  Reset(SrcFile, 1);
  Rewrite(DestFile, 1);
  while not Eof(SrcFile) do
  begin
    BlockRead(SrcFile, Buff^, BuffSize, R);
    BlockWrite(DestFile, Buff^, R);
  end;
  Close(SrcFile);
  Close(DestFile);
  FreeMem(Buff);
end.

Mozda ima po neka greska jer sam ovo pisao iz glave, ali to je princip.
[ Passwd @ 06.04.2005. 18:49 ] @
Nisam napomenio da imam borland turbo pascal,tako da ne rade neke naredbe kao i u freepascalu (get,put...).Ne kuzim ovaj program sto si ga gore napisao.
Evo primjer:na c disku postji datoteka sllika.jpg, a ja trebam program koji ce tu sliku.jpg prebaciti na drugo mjesto (npr.:d disk).A kako da mu napisem gdje da kopira taj fajl i koji fajl??
[ Srki_82 @ 06.04.2005. 23:06 ] @
Ovaj kod je Borland Turbo Pascal 7... kod je vrlo jednostavan
Code:
const
  BuffSize = 32 * 1024; // 32 kb

Ovaj deo odredjuje velicinu bafera koji ce se koristiti za prenos... 32kb je sasvim dovoljno, ali mozes da ga povecas do max 64k
Code:
var
  SrcFile, DestFile: File;
  Buff: Pointer;
  R: Word;
  SrcName, DestName: String;

SrcFile i DestFile su promenljive koje identifikuju datoteke... SrcFile fajl koji zelis da kopiras, a DestFile je nov fajl koji se dobija kopiranjem.
Buff je bafer koji se koristi za kopiranje... prvo se iz izvornog fajla procita odredjeni broj bajtova u bafer pa se iz bafera ti bajtovi upisu u nov fajl.
R je promenljiva koja se koristi prilikom citanja i pisanja bajtova. Kada procitamo bajtove iz izvornog fajla mi zatrazimo BuffSize bajtova, ali ne mora da znaci da je toliko ostalo u izvrsnom fajlu da se procita pa nam u R ostaje stvaran broj procitanih bajtova koje treba da upisemo u nov fajl.
SrcName i DestName su imena fajlova. To je jedino sto treba da das programu da bi mogao da odradi svoj posao. Ako hoces da kopiras sllika.jpg sa C: na D: onda je SrcName := 'C:\sllika.jpg', a DestName := 'D:\sllika.jpg';
Code:
  GetMem(Buff, BuffSize);
  Assign(SrcFile, SrcName);
  Assign(DestFile, DestName);
  Reset(SrcFile, 1);
  Rewrite(DestFile, 1);

Ovaj deo zauzima memoriju za bafer koji ce nam sluziti za kopiranje i otvara izvorni fajl za citanje i nov fajl za pisanje. Ovde je sve jasno.
Code:
  while not Eof(SrcFile) do
  begin
    BlockRead(SrcFile, Buff^, BuffSize, R);
    BlockWrite(DestFile, Buff^, R);
  end;

Ovo je deo koji radi kopiranje. Dok izvorni fajl nije procitan do kraja izvrsava se while petlja. U bafer se ucitava BuffSize bajtova i u R dobijamo tacan broj bajtova koji smo dobili. Zatim se iz bafera upisuje R bajtova u nov fajl i tako sve do kraja izvornog fajla.
Code:
  Close(SrcFile);
  Close(DestFile);
  FreeMem(Buff);

Na kraju zatvaramo oba fajla i oslobadjamo memoriju koju smo koristila za baferovanje podataka.
To je cela mudrost... od ovog mozes napraviti proceduru npr. CopyFile koja uzima dva stringa SrcName i DestName i jednostavno mozes da je pozoves kao CopyFile('C:\slika.jpg', 'D:\slika.jpg');
Nadam se da ti je sad jasno.
[ bancika @ 07.04.2005. 15:41 ] @
a sta fali CopyFile(Source, Destination, Overwrite)?
[ Srki_82 @ 07.04.2005. 17:11 ] @
U TP 7 to ne postoji, zar ne?
[ Passwd @ 07.04.2005. 19:05 ] @
Lijepo si to pojasnio,svaka cast.
Hvala!!
[ Vdjuric @ 07.04.2005. 23:59 ] @
Trebalo bi tu ubaciti jos i proveru da li je citanje / zapisivanje odradjeno kako treba... preko ioresult promenljive i {$I-}, {$I+} direktiva kompajleru, i to je to...
poz