Newsgroup: it.comp.lang.c
Titolo: copia file??

Salve, nn sono riuscito a trovare una funzione standard C che facesse la
copia di 1 file, ho creato una funzioncina..
ma nn funziona a dovere..
magari voi trovate dove sono inciampato !
thanx a lot !
jojo
/***** code : file_copy *****/
int file_copy(char * source_file,char * target_file)
{
    FILE *source,*target;
    char c;
    strcpy(sub_name,"file_copy");
    if((source=fopen(source_file,"rb"))==NULL)
    {
          sprintf(error_string,"\nError on sub '%s'\nUnable to open (reading
: %s )",sub_name,source_file);
          exit_on_error(); // è una routine per la gestione generica degli
errori...
     }
    if((target=fopen(target_file,"wb"))==NULL)
     {
          sprintf(error_string,"\nError on sub '%s'\nUnable to open (writing
: %s )",sub_name,target_file);
          exit_on_error();
      }
// routine di copia..
    while(c!=EOF)
     {
          c=getc(source);
          if(c!=EOF) putc(c,target);
          fclose(source);
         fclose(target);
         return 1; // restituisce vero..
    }
}

 ha scritto nel messaggio
news:hbM%9.128682$0v.36...@news1.tin.it...


copia di 1 file, ho creato una funzioncina..
#include <stdio.h>
#if (defined(__MSDOS__) || defined(__WIN32__))
#define OPENMODE_READ "rb"
#define OPENMODE_WRITE "wb"
#else
#define OPENMODE_READ "r"
#define OPENMODE_WRITE "w"
#endif
int copyfile(const char *source,
             const char *dest)
{
     FILE *ifile, *ofile;
     int c;
     ifile = fopen(source, OPENMODE_READ);
     if (ifile == NULL) return 0;
     ofile = fopen(dest, OPENMODE_WRITE);
     if (ofile == NULL)
     {
        if (ifile) fclose(ifile);
        return -1;
     }
     while ((c = fgetc(ifile)) != EOF)
           fputc(c, ofile);
     return 1;
}
int main()
{
    switch (copyfile("C:\\Programmi\\GetRight\\getright.exe",
                     "C:\\Programmi\\GetRight\\getright2.exe"))
    {
       case  0: puts("Impossibile aprire file di input"); break;
       case -1: puts("Impossibile aprire file di output !"); break;
       case  1: puts("Copia OK !"); break;
    }
    getchar();
    return 0;
}
-- 
Andrea Laforgia
#exclude <windows.h>

            fputc(c, ofile);
soluzione portabilissima..
se ti accontenti di restare in POSIX.1 ( stat e fstat non sono nello
stadard )
puoi fare qualcosa tipo:
#define FILECOPYBUFSIZE 8192
int copyfile(FILE* ifile , FILE* ofile)
{
    char buffer[FILECOPYBUFSIZE];
    unsigned int timestoread, sizelasttime, counter;
    struct stat statbuf;
    if(fstat( fileno(ifile), &statbuf)!=0)
        return 1;
    timestoread = statbuf.st_size / FILECOPYBUFSIZE;
    sizelasttime= statbuf.st_size % FILECOPYBUFSIZE;
    /*
        mancano i test su fread e fwrite..
    */
    for(counter=0; counter!= timestoread; counter++)
    {
        fread (buffer, FILECOPYBUFSIZE, 1, ifile);
        fwrite(buffer, FILECOPYBUFSIZE, 1, ofile);
    }
    fread (buffer, sizelasttime, 1, ifile);
    fwrite(buffer, sizelasttime, 1, ofile);
    return 0;
}
ripeto.. a scapito di uscire dallo standard..
`forse` ne guadagneresti in efficienza ( di cui `forse` potresti avere
bisogno).
Ciao,
    Sbirish

nn funge..! :-(
ho provato anche usando nella mia fgetc e fputc..
alcuni file li stoppa prima della fine...
(c'entra qualcosa il fatto che siano immagini?)
...
bye
jojo

 wrote in message
news:pfR%9.130033$0v.36...@news1.tin.it...

no c'entra col fatto che tu c l'hai dichiarato char e non int
Sbirish

nn funge..! :-(
Strano, sulla mia macchina funziona perfettamente...


 bisogno).
perchè questa via è + efficente? mi potresti spiegare la differenza tra i
due algoritmi?
thanx !
jojo

> Strano, sulla mia macchina funziona perfettamente...
nono funge..
scusami !


 jojo
ciao
    Sbirish

 torni al magazzino e ricominci da capo finché non sono finite
ehehe
ok, perfetto !
:-)
jojo

sbirish <sbi...@dontspam.me.tnx> wrote:

potrebbe usare anche una
soluzione 3) le carichi tutte su un camion gigantesco
usando mmap?
costa