Hardlinks von allen Dateien eines Ordner incl. Unterordnern erstellen



  • Hallo,
    ich möchte mit fsutil.exe Hardlinks erstellen.

    So soll das ganze aussehen:

    c:\Ordner\2009-10-20_10-30\Ordner mit Unterordner und Dateien
    c:\Ordner\2009-10-21_20-30\Ordner mit Unterordner und Dateien

    Jetzt soll das Programm das neuste Datum raussuchen, hier 2009-10-21_20-30 (es könnte aber auch sein, dass dieser Ordner gelöscht wurde und das Programm den Ordner davor raussuchen muss, es darf sich also nicht merken, welches der letzte Ordner ist, den es angelegt hat) und einen Ordner vom aktuellen Datum/Uhrzeit in c:\Ordner anlegen.
    Danach die Ordnerstruktur spiegeln und anhand einer Linkliste (dir c:\Ordner\(neustes Datum/Uhrzeit /S /B > dateien.txt) die Dateien mit fsutil.exe als Hardlinks anlegen.

    Der neue Ordner soll dann so aussehen:
    c:\Ordner\2009-10-25_21-42\Ordner mit Unterordner und Dateien als Hardlinks

    Meint ihr das ist in C möglich, denn da hab ich wenigsten leichte Grundkenntnisse?



  • Selbstverständlich ist das in C möglich, mit C wurden und werden Projekte in ganz anderen Dimensionen realisiert.
    Das hier ist aber das C++ - Unterforum. Du bist wohl am besten im Bereich WinAPI aufgehoben.



  • Ist es denn in C++ einfacher?
    Müsste ja sowieso stark auf eurer Wissen zurückgreifen.



  • In C++ ist aufgrund der erweiterten Möglichkeiten vieles einfacher, also ja.
    Kommt natürlich auch darauf an, wie viel Erfahrung man mit der jeweiligen Sprache schon gemacht hat.

    Aber sowohl in C wie auch in C++ kannst du auf WinAPI-Funktionen zurückgreifen (zum Finden der Ordner FindFirstFile und FindNextFile - in C++ wrappst du das sinnvollerweise in einer einzigen Funktion).
    Um fsutil.exe aufzurufen, kannst du ShellExecute, CreateProcess oder schlicht system benutzen.
    Bleibt noch, die Ordnernamen zu parsen - das ist in C++ mit std::string natürlich einfacher.



  • Was ist denn System unabhängiger? Also es sollte dann schon auf XP, Vista, Win 7 und vielleicht auch auf der nächsten Windows Version laufen.



  • Alle genannten Funktionen gibt es mindestens seit Windows 95.
    Wobei "auf allen Windows-Versionen" jetzt nicht unbedingt meiner Definition von systemunabhängig entspricht.



  • Wobei "auf allen Windows-Versionen" jetzt nicht unbedingt meiner Definition von systemunabhängig entspricht.

    Das stimmt natürlich, mir reicht das aber.

    Hab mich jetzt für C++ entschieden und auch schon kleine Fortschritte gemacht.

    Hier mal der Code für die aktuelle Uhrzeit:

    #include <windows.h>
    #include <stdio.h>
    
    int main()
    {
        SYSTEMTIME lt;
        GetLocalTime(&lt);
    
        printf("The local time is: %02d-%02d-%02d_%02d-%02d\n\n", lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute);
    
        system("pause");
    }
    

    Und hier mal um den letzten Ordner zu finden:

    #include<stdio.h>
    #include <windows.h>
    #include <iostream>
    //# include <stdlib>
    using namespace std;
    
    int main(){
    HANDLE fHandle; 
    WIN32_FIND_DATA dir_date_old; 
    
    fHandle=FindFirstFile("C:\\Ordner\\*",&dir_date_old);
    
    do 
    {
    } 
    while (FindNextFile(fHandle,&dir_date_old));
    
    cout <<dir_date_old.cFileName <<"\n\n";          //Ausgabe, nur zu Testzwecken
    
    FindClose(fHandle);
    
    system("pause");
    }
    

    Ich möchte jetzt 2 Variablen (Strings?) erstellen, in folgender Form:

    Variable1=c:\Ordner\dir_date_old.cFileName;
    Variable2=c:\Ordner\LocalTime;

    Wie bekomme ich das hin?



  • Wie kann ich das aktuelle Datum in eínem String speichern?

    Mein Versuch:

    #include <stdio.h>
    #include <windows.h>
    #include <iostream>
    
    using namespace std;
    
    int main(){
    SYSTEMTIME lt;
        GetLocalTime(&lt);
    
    std::string date=lt.wYear;
    }
    

    Bekomme folgenden Fehler: invalid conversion from `WORD' to `const char*'



  • Lies mal das hier
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39488.html
    Das ist aus der FAQ (Einmal Zahl nach String und zurück)



  • Danke Braunstein,
    das hat funktioniert.

    SYSTEMTIME lt;
        GetLocalTime(&lt);
    
        ostringstream date;                                                        
        date << lt.wYear <<"-" <<lt.wMonth <<"-" <<lt.wDay <<"_" <<lt.wHour <<"-" <<lt.wMinute;       
        string date_today(date.str());       
    
        std::string dir_date_today = "c:\\Ordner\\"+date_today;
    

    Habe jetzt das Problem, dass er mir das aktuelle Datum so anzeigt: 2009-10-27_22-8

    anstatt: 2009-10-27_22-08

    Das wird er Mitsicherheit auch beim Monat, Tag und der Stunde machen. Wie funktioniert denn das?



  • Du kannst die Stream-Manipulatoren 'setw' und 'setfill' dafür benutzen, s. z.B. http://www.c-plusplus.net/forum/viewtopic-var-t-is-251961-and-highlight-is-setw.html



  • Th69 schrieb:

    Du kannst die Stream-Manipulatoren 'setw' und 'setfill' dafür benutzen

    Damit hats funktioniert. Besten Dank Th69.

    Möchte von einem Quellordner die Verzeichnisstruktur in einen Zielordner kopieren.
    In einem String hab ich den Link vom Quellordner und in einem Weiteren den vom Zielordner.

    Als Batch Datei ginge dies:
    xcopy Quelle Ziel /t /e

    Wie kann ich das elegant lösen?


Anmelden zum Antworten