Avatar billede xantor Nybegynder
06. januar 2005 - 17:28 Der er 10 kommentarer

Kopier fil

Hejsa eksperter.

Jeg er stadig rimelig ny i C++ og jeg bruger borland c++ builder.

Jeg vil gerne lave en et mikro program (for øvelsens skyld) der kan kopierer en fil og vise hastighed og en statusbar for overførslen. Hertil har jeg nogle teorier om hvordan det skal foregå. f.eks. Opretter jeg de 2 file handles på en eller anden måde og bruger en løkke til at flytte f.eks. 64KB af gangen og en gang i sekundet tjekker jeg så hvor mange 64KB blokke der er flyttet og får dermed KB/s og statusbaren bliver en simpel overført nu/total filstørrelse til procent beregning.

Mit spørgsmål går så på. hvad er den smarteste metode til at kopierer filen på en måde så jeg faktisk kan aflæse hvor meget data der er flyttet.

Det var vist det
Avatar billede arne_v Ekspert
06. januar 2005 - 19:23 #1
Umiddelbart synes jeg at du selv har beskrevet løsningen i generelle
termer.

Så skal du vel bare vælge om du vil bruge:

fp1 = fopen(fnm1, "rb");
fp2 = fopen(fnm2, "rw");

eller:


ifstream f1(fnm1, ios::binary);
ofstream f2(fnm2, ios::binary);
Avatar billede xantor Nybegynder
07. januar 2005 - 00:48 #2
Ok... umiddelbart hælder jeg til den nederste af de metoder du beskriver. men det jeg fiskede efter var sådan set en mere konkret beskrivelse af hvordan løkken der overfører f.eks. 64 KB af gangen skulle se ud :-)
Avatar billede arne_v Ekspert
07. januar 2005 - 07:25 #3
Det regulerer du vel ved at bruge en buffer på 64KB til at læse ind i og
skrive ud fra.
Avatar billede zapzap Nybegynder
11. januar 2005 - 16:20 #4
Du kan jo bruge den gamle måde med en callback function (utestet fra 'toppen af mit hovede):
void DoCopy ( const char *fnm1, const char *fnm2, (void) (*fnCallback)(int) );

FILE *fp1 = fopen(fnm1, "rb");
FILE *fp2 = fopen(fnm2, "rw");

#define BLOCKSIZE 64000
unsigned char buf[BLOCKSIZE];

int readBytes;
while ( !feof (fp1) ) {
  readBytes = fread ( buf, BLOCKSIZE, 1, fp1 );
  fwrite ( buf, BLOCKSIZE, 1, fp2 );
  fnCallBack ( readBytes );
}
}
Avatar billede tommya Nybegynder
14. januar 2005 - 22:53 #5
Kan dette ikke gøre ved hjælp af API funktionen CopyFileEx ?
Avatar billede arne_v Ekspert
14. januar 2005 - 22:58 #6
Det ser sådan ud
Avatar billede tommya Nybegynder
14. januar 2005 - 23:00 #7
Fra Win32 SDK hjælpefilen

  BOOL CopyFileEx(
    LPCWSTR lpExistingFileName,    // pointer to name of an existing file
    LPCWSTR lpNewFileName,    // pointer to filename to copy to
    LPPROGRESS_ROUTINE lpProgressRoutine,    // pointer to the callback function
    LPVOID lpData,    // to be passed to the callback function
    LPBOOL pbCancel,    // flag that can be used to cancel the operation
    DWORD dwCopyFlags    // flags that specify how the file is copied
  );

lpProgressRoutine <-- læg mærke til denne
Avatar billede arne_v Ekspert
22. januar 2005 - 22:42 #8
xantor>

Tid at få afsluttet dette spørgsmål ?
Avatar billede zapzap Nybegynder
10. februar 2005 - 13:41 #9
Spm. gik på at han er ved at lære C++, og man lærer ikke meget C++ ved at kalde diverse Win API'er.
Avatar billede tommya Nybegynder
10. februar 2005 - 17:15 #10
så er det jo godt at du har lagt et fyldestgørende svar som han kan bruge zapzap :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester