Dateiänderung abfrage bei Kopiervorgang



  • Hallo,

    ich schreibe gerade ein Programm um Dateien von a nach b zu kopieren, ich habe dazu schon einiges im Forum gefunden z.B hier:

    [url]
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-142409-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html
    [/url]

    Leider wurde mein Problem dort nicht behandelt. Das Kopieren funktioniert bei mir schon. Nur ich möchte noch eine zusatzfunktion die nur dann das Kopieren ermöglicht wenn änderungen an der Datei vorgenommen wurden.
    Also wenn z.B in einem Ordner deren Inhalt ich kopieren will sich 3 Dateien befinden (Test1, Test2, Test3), diese sich auch in dem Zielordner befinden und nur an der Test3 Datei änderungen vorgenommen wurden soll das Programm nur die Test3 Datei kopieren und überschreiben.

    Wie mache ich also die Abfrage ob eine änderung vorgenommen wurde?

    Danke



  • Hallo

    du must das Änderungsdatum der jeweiligen Dateien ermitteln und vergleichen.
    Inwieweit das bei den SHFileOperation geht, must du in der MSDN dazu nachlesen.
    Oder dich in ins WinAPI-Forum verschieben lassen

    bis bald
    akari



  • Das mit dem Änderungsdatum habe ich mir schon gedacht, doch wie frage ich es ab???



  • Hallo

    wie ich schon geschrieben habe, bei SHFileOp kann ich dir nicht helfen, da must du dich in der MSDN und im WinAPI-Forum umschauen.

    Wenn du die Dateien selber mit FindFirst/FindNext suchen würdest, könnest du über TSearchRec::FindData::ftLastWriteTime das Datum bestimmen.

    bis bald
    akari



  • Das letzte Änderungsdatum sollte sich so ermitteln lassen:

    int iFileHandle;
    iFileHandle = FileOpen(Dateiname, fmOpenRead);
    int iFileAge = FileGetDate(iFileHandle);
    FileClose(iFileHandle);
    

    Dateiname ist ein AnsiString in dem sich der Dateiname befindet. Vorzugsweise inklusive des kompletten Pfades.

    Umwandeln in ein TDateTime:

    TDateTime dtFile = FileDateToDateTime(iFileAge);
    


  • Hier noch eine Funktion die die 3 Zeitangaben mit WinAPI ausliest

    bool GetFileTimes(vector<TDateTime>& timevect, const AnsiString &FileName)
    {
      vector<FILETIME> ftime(3);
      HANDLE hFile = CreateFile(TEXT(FileName.c_str()),    // file to open
                       GENERIC_READ,          // open for reading
                       FILE_SHARE_READ,       // share for reading
                       NULL,                  // default security
                       OPEN_EXISTING,         // existing file only
                       FILE_ATTRIBUTE_NORMAL, // normal file
                       NULL);                 // no attr. template
    
      if (hFile == INVALID_HANDLE_VALUE)
         return false;
      GetFileTime(hFile, &ftime[0], &ftime[1], &ftime[2]);
      CloseHandle(hFile);
      SYSTEMTIME stime;
      timevect.clear();
    // Creation time
      if( !FileTimeToSystemTime(&ftime[0], &stime)) return false;
      timevect.push_back(TDateTime(stime.wYear, stime.wMonth, stime.wDay));
    // last access time
      if( !FileTimeToSystemTime(&ftime[1], &stime)) return false;
      timevect.push_back(TDateTime(stime.wYear, stime.wMonth, stime.wDay));
    // last write time
      if( !FileTimeToSystemTime(&ftime[2], &stime)) return false;
      timevect.push_back(TDateTime(stime.wYear, stime.wMonth, stime.wDay));
      return true;
    }
    


  • Der Beitrag von Joe_M hat mir schon sehr gut weitergeholfen, nun möchte ich aber dies noch ein wenig erweitern.

    Die Abfrage bei einzelnen Dateien hat schon prima geklappt, nun möchte ich es aber so das er beim kopieren eines kompletten Ordnerinhaltes nur die Dateien kopiert die mit den Dateien des Zielordners nicht mehr überein stimmen vom Änderungsdatum aus gesehen.

    Da ich ja aber im Vorfeld nicht weiß welche und wieviele Dateien sich in dem Quellordner befinden, da ja auch neu dazu kommen könnten, weiß ich nicht wie ich sowas abfrage!



  • Erste Möglichkeit: Du führst FindFile bei beiden Ordner aus und kannst so überprüfen ob diese unterschiedlich sind.

    Zweite Möglichkeit: Du führst FindFile beim Quellordner aus, iterierst dann durch alle Dateien und kannst dann mit FindFile überprüfen ob die Datei im Zielordner existiert und welches Datum diese hat.

    Dritte Möglichkeit: Wie die 2te nur benutzt du FileExist um herauszufinden ob die Datei im Zielordner existiert und irgendeine andere Methode um das Änderungsdatum zu überprüfen.



  • Ich denke die erste Möglichkeit scheint am besten für mich zu sein.

    Könntest du vielleicht mal ein Beispielcode Posten, habe nämlich keine Ahnung wie ich da anfangen soll.

    Wäre echt klasse, danke!



  • Schau Dir in der BCB-Hilfe mal das Beispiel zu FindFirst an.



  • Hab mir das Beispiel angesehen doch leider gibts da keine genaue erklärung. Das bringt mir leider nichts, denn ich möchte es auch ganz gern verstehen um es für meine Bedürfnisse anzugleichen.


Log in to reply