Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » doppelte Dateien finden

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.05.2011, 08:21 Uhr
~sirms
Gast


Hallo,

ich beschäftige mich gerade mit c++ und will ein Programm entwickeln was mir doppelte Dateien in einem Ordnerpfad angibt. Dabei sollen auch die Unterordner betrachtet werden. Da die Laufzeit des Programmes sicher etwas länger dauert wollte ich mal fragen welche Algorithmen ihr mir empfehlen könntet oder welche Funktionen es vielleicht sogar schon gibt? Am ende soll der Dateiname und der jeweilige Pfad ausgegeben werden.

Vielen Dank schonmal
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.05.2011, 09:03 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja das einfachste wäre wohl, einfach immer das änderungsdatum, dateigröße und vielleicht sogar dateihash (z.b einfache quersumme) zum überprüfen ob eine datei geändert oder gleich ist. diese infos liest du aus und fügst sie z.b ein eine multimap ein. danach liest du dir aus deiner map nur noch die doppelte einträge aus und vergleichst eben die gerade genannten elemente -> voila schon hast du deine doppelten dateien gefunden.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.05.2011, 08:36 Uhr
~sirms
Gast


Danke. Hab es jetzt größtenteils umgesetzt. Nur mit der ermittlung vom Dateihash komm ich nicht klar bzw fehlt mir der Ansatz.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.05.2011, 10:19 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hier ist ein (MFC)-Codesnippet


C++:
CString &Cmd5Capi::Digest(CString & csBuffer)
{
    HCRYPTPROV hCryptProv;
    HCRYPTHASH hHash;
    BYTE bHash[0x7f];
    DWORD dwHashLen= 16; // The MD5 algorithm always returns 16 bytes.
    DWORD cbContent= csBuffer.GetLength();
    BYTE* pbContent= (BYTE*)csBuffer.GetBuffer(cbContent);


    if(CryptAcquireContext(&hCryptProv,
        NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
    {

        if(CryptCreateHash(hCryptProv,
            CALG_MD5,    // algorithm identifier definitions see: wincrypt.h
            0, 0, &hHash))
        {
            if(CryptHashData(hHash, pbContent, cbContent, 0))
            {

                if(CryptGetHashParam(hHash, HP_HASHVAL, bHash, &dwHashLen, 0))
                {
                    // Make a string version of the numeric digest value
                    csDigest.Empty();
                    CString tmp;
                      for (int i = 0; i<16; i++)
                      {
                        tmp.Format("%02x", bHash[i]);
                        csDigest+=tmp;
                      }

                }
                else csDigest=_T("Error getting hash param");

            }
            else csDigest=_T("Error hashing data");
        }
        else csDigest=_T("Error creating hash");

    }
    else csDigest=_T("Error acquiring context");


    CryptDestroyHash(hHash);
    CryptReleaseContext(hCryptProv, 0);
    csBuffer.ReleaseBuffer();
    return csDigest;
}



(Quelle: www.codeproject.com/KB/security/cryptest.aspx)

das muss man ja ggf nur umschreiben. Im Prinzip musst du halt dann die Datei(en) einlesen, die durch die Krypto-funktionen da jagen und dir den digestfür jede file merken.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.05.2011, 13:17 Uhr
~sirms
Gast


hi, habe das soweit hinbekommen. Eine Frage hätte ich noch.

Wie gibt man Iteratoren bzw die Daten auf die gezeigt wird wieder frei? In diesem bsp wäre es die multimap welche einen string und ein nicht mit new erzeugtes Object beinhaltet.



C++:
void printDataFiles(){
    multimap<string,dataFiles>::iterator df,df2;
    df= doubleDatafiles.begin();    
    df2=doubleDatafiles.begin();
    string checksum;
    multimap<string,dataFiles> result;
    multimap<string,dataFiles>::iterator ItResult;
    list<string> pathList;
    list<string>::iterator ItPath;


    while(df2 != doubleDatafiles.end()){        
        
        checksum=df2->second.getCheckSum();
    while(df !=doubleDatafiles.end()){        
        
        if(df2 != df){

            if(checksum==df->second.getCheckSum()){    
                if(contain(df2->second ,result)==false){                    
                    result.insert(pair<string,dataFiles>(df2->first,df2->second));
                }
                                
                if(contain(df->second,result)==false){    
                    result.insert(pair<string,dataFiles>(df->first,df->second));
                }        
            }
        }        
        df++;
    }
    if(result.size()>0){
        ItResult=result.begin();
        if(!pathContain(ItResult->second.getPath(),pathList)){
    cout<< "Folgende Dateien sind mit Namen und Inhalt identisch: "<<endl;
    while(ItResult != result.end()){
        cout<<"Name: "<<ItResult->second.getFileName()<<endl;
        cout<<"Pfad: "<<ItResult->second.getPath()<<endl;
        cout<<"Groesse: "<<ItResult->second.getSize()<<" Bytes"<<endl;
        cout<<"letzte Aenderung. "<<ItResult->second.getLastChange()<<endl<<endl;
        pathList.push_back(ItResult->second.getPath());

    ItResult++;
    }
    }
    }else{
        cout<< "keine doppelten Dateien gefunden"<<endl;
    }    
    result.clear();
    df=doubleDatafiles.begin();
    df2++;
    }    
}



Vielen Dank schonmal im Voraus!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.05.2011, 13:41 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


da du nirgends explizit speicher anlegst, musst du ihn auch nicht manuell aufräumen
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: