Dateiverwaltung: erkennen, ob eine Datei fertig kopiert worden ist



  • Hallo@all

    Ich will eine Datei im Verzeichnis WINDOWS\SPOOL\PRINTERS\ die über das Netztwerk kopiert wird erkennen und weiterbearbeiten.

    Mit findfirst finde ich die Datei bereits, siehe Code unten.

    Das Problem:
    findfirst zeigt die Datei bereits zu beginn des Kopiervorgangs an :-((

    Mit welcher Funktion erkenne ich, ob die Datei bereits fertig kopiert worden ist ?
    Damit ich mit der Datei arbeiten kann?

    //---------------------------------------------------------------------------
    
    #pragma hdrstop
    
    //---------------------------------------------------------------------------
    
    #pragma argsused
    
    #include <dir.h>
    
    //int findfirst(const char *pathname, struct ffblk *ffblk, int attrib);
    
    int haltepunkt=1;
    
    int main()
    {
    
      struct ffblk f;
    int done = findfirst("\\WINDOWS\\SPOOL\\PRINTERS\\*.*", &f, FA_SYSTEM);
    while (!done)
    {
      printf("%10u %2u:%02u:%02u %2u/%02u/%4u %s\n",
        f.ff_fsize,
        (f.ff_ftime >> 11) & 0x1f,
        (f.ff_ftime >>  5) & 0x3f,
        (f.ff_ftime & 0x1f) * 2,
        (f.ff_fdate >>  5) & 0x0f,
        (f.ff_fdate & 0x1f),
        ((f.ff_fdate >> 9) & 0x7f) + 1980,
        f.ff_name);
      done = findnext(&f);
    }
    
            return 0;
    }
    //---------------------------------------------------------------------------
    


  • Ich bin mir nicht sicher, aber während des Kopierens sollte das andere Programm exklusiven Zugriff auf die Datei bestellt haben - das würde bedeuten, daß ein fopen() scheitern sollte, wenn du die Datei zu öffnen versuchst, bevor sie bereit ist:

    FILE* f;
    do
      f=fopen(datei,"r");
    while(f!=NULL);
    


  • ich haette den thread nicht ohne was zu sagen verschieben duerfen. sorry deswegen.
    da ist der originalthread: http://www.c-plusplus.net/forum/viewtopic-var-t-is-134600.html



  • Hallo,

    ich habs jetzt raus :-))

    Also f.ff_fsize liefert während des Kopiervorgangs den Wert 0 und ers am Ende des Kopiervorgangs die Dateigröße.

    Ich prüfe also so lange mit findfirst, bis f.ff_fsize nicht mehr 0 ist

    do{
    done = findfirst("\\WINDOWS\\SPOOL\\PRINTERS\*.spl", &f, FA_SYSTEM);

    }while ((done==-1)||f.ff_fsize<=0);

    void suche_job()
    {
    
    int done=-1;
    struct ffblk f;
    
         do{
        // pause(2);
         done = findfirst("\\WINDOWS\\SPOOL\\PRINTERS\\*.spl", &f, FA_SYSTEM);
    
         }while ((done==-1)||f.ff_fsize<=0);
    
        strcat (spl_file,f.ff_name);
    
        strcpy(printjob,"\\WINDOWS\\SPOOL\\PRINTERS\\");
        strcat(printjob,spl_file);
    
        strcpy(shdfile,spl_file);
        shdfile[6]='s';
        shdfile[7]='h';
        shdfile[8]='d';
        strcpy(dummy,shdfile);
        strcpy(shdfile,"\\WINDOWS\\SPOOL\\PRINTERS\\");
        strcat(shdfile,dummy);
    
        do{
    
        splFile = fopen (printjob,"r");
             if (splFile!=NULL)
             {
    
               fclose (splFile);
             }
    
             pause(5);
    
        }while(splFile==NULL);
    
    }
    

Anmelden zum Antworten