Unterschiedliche Ordnernamen auf eine Datei durchsuchen



  • nach c&p an die entsprechenden stellen musste ich noch windows.h includieren, folgende fehler beim erstellen:

    1>d:\test\getversion\getversion\getpathname.cpp(43): error C2143: Syntaxfehler: Es fehlt ',' vor ':'
    1>d:\test\getversion\getversion\getpathname.cpp(43): error C2530: 'f': Verweise müssen initialisiert werden
    1>d:\test\getversion\getversion\getpathname.cpp(43): error C3531: "f": Ein Symbol, dessen Typ "auto" enthält, muss einen Initialisierer aufweisen.
    1>d:\test\getversion\getversion\getpathname.cpp(43): error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    1>d:\test\getversion\getversion\getpathname.cpp(45): error C2079: 'ss' verwendet undefiniertes class 'std::basic_stringstream<_Elem,_Traits,_Alloc>'
    1>          with
    1>          [
    1>              _Elem=char,
    1>              _Traits=std::char_traits<char>,
    1>              _Alloc=std::allocator<char>
    1>          ]
    1>d:\test\getversion\getversion\getpathname.cpp(47): error C2678: Binärer Operator '>>': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'int' akzeptiert (oder keine geeignete Konvertierung möglich)
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(1360): kann 'CArchive &operator >>(CArchive &,ATL::CTimeSpan &)' sein
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(1367): oder "CArchive &operator >>(CArchive &,ATL::CTime &)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(1577): oder "CArchive &operator >>(CArchive &,CObject *&)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(1578): oder "CArchive &operator >>(CArchive &,const CObject *&)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(67): oder "CArchive &operator >>(CArchive &,CByteArray *&)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(142): oder "CArchive &operator >>(CArchive &,CWordArray *&)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(217): oder "CArchive &operator >>(CArchive &,CDWordArray *&)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(438): oder "CArchive &operator >>(CArchive &,CObArray *&)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(513): oder "CArchive &operator >>(CArchive &,CStringArray *&)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(697): oder "CArchive &operator >>(CArchive &,CObList *&)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(798): oder "CArchive &operator >>(CArchive &,CStringList *&)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(1157): oder "CArchive &operator >>(CArchive &,CMapWordToOb *&)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(1324): oder "CArchive &operator >>(CArchive &,CMapStringToOb *&)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxcoll.h(1408): oder "CArchive &operator >>(CArchive &,CMapStringToString *&)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxwin.h(267): oder "CArchive &operator >>(CArchive &,SIZE &)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxwin.h(268): oder "CArchive &operator >>(CArchive &,POINT &)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxwin.h(269): oder "CArchive &operator >>(CArchive &,RECT &)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxdisp.h(959): oder "CArchive &operator >>(CArchive &,COleVariant &)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxdisp.h(963): oder "CArchive &operator >>(CArchive &,ATL::CComBSTR &)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxdisp.h(1038): oder "CArchive &operator >>(CArchive &,COleCurrency &)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxdisp.h(1045): oder "CArchive &operator >>(CArchive &,ATL::COleDateTime &)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\atlmfc\include\afxdisp.h(1052): oder "CArchive &operator >>(CArchive &,ATL::COleDateTimeSpan &)"
    1>          bei Anpassung der Argumentliste '(int, std::string)'
    1>d:\test\getversion\getversion\getpathname.cpp(49): error C2668: 'std::to_string': Mehrdeutiger Aufruf einer überladenen Funktion
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\string(688): kann 'std::string std::to_string(long double)' sein
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\string(680): oder "std::string std::to_string(_ULonglong)"
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\string(672): oder "std::string std::to_string(_Longlong)"
    1>          bei Anpassung der Argumentliste '(int)'
    1>d:\test\getversion\getversion\getpathname.cpp(49): error C2228: Links von ".c_str" muss sich eine Klasse/Struktur/Union befinden.
    1>
    1>Fehler beim Erstellen
    1>
    1>Verstrichene Zeit 00:00:00.26
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    
    #include "stdafx.h"
    #include <vector>
    #include <string>
    #include "Windows.h"
    
    #ifdef UNICODE
    #define tstring wstring
    #define tstringstream wstringstream
    #else
    #define tstring string
    #define tstringstream stringstream
    #endif
    
    std::vector<std::tstring> getFolders(const std::tstring &path){
        std::vector<std::tstring> files;
        WIN32_FIND_DATA WFD;
        HANDLE h = FindFirstFile(path.c_str(), &WFD);
        if (h == INVALID_HANDLE_VALUE)
            return files;
        do if (WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            files.push_back(WFD.cFileName);
        while (FindNextFile(h, &WFD));
        FindClose(h);
        return files;
    }
    /**************************************************************************\
    
    extern char      GetPathName    // wird der teil überhaupt benötigt?
    (
     char           *pszFileName,          
     char           *pszSearchString,      
     CString&       strResultString,         
     char			strSearchPath,
    
     )
    
    {
     for (auto & f : getFolders(_T("C:\\Program Files (x86)\\Adobe\\"))){
        std::tstring dummy;
        std::tstringstream ss(f);
        int version;
        if (ss >> dummy >> version){
            if (dummy == _T("Reader")){
                MessageBoxA(0, std::to_string(version).c_str(), "Version:", MB_ICONEXCLAMATION);
            }
        }
    }
    }
    
    //  end GetPathName
    


  • Benutzt du Visual Studio? Wenn ja welches?
    Wahrscheinlich hast du ein VS2010, das kann noch keine so hübschen auto loops.

    Zeile 34:

    for (auto & f : getFolders(_T("C:\\Program Files (x86)\\Adobe\\"))){
    

    Ersetzen durch:

    auto folders = getFolders(_T("C:\\Program Files (x86)\\Adobe\\"));
    for (auto f = begin(folders); f != end(folders); ++f){
    


  • ja es ist vs2010.

    extern char      GetPathName    // > error code
    (
     char           *pszFileName,           // < Filename Objekt
     char           *pszSearchString,       // < Suchstring
     CString&       strResultString,         // > Resource String
     char			strSearchPath
    
     )
    
    auto folders = getFolders(_T("C:\\Program Files (x86)\\Adobe\\"));
    for (auto f = begin(folders); f != end(folders); ++f){
        std::tstring dummy;
        std::tstringstream ss(f);
        int version;
        if (ss >> dummy >> version){
            if (dummy == _T("Reader")){
                MessageBoxA(0, std::to_string(version).c_str(), "Version:", MB_ICONEXCLAMATION);
            }
        }
    }
    }
    
    1>d:\test\getversion\getversion\getpathname.cpp(43): error C2059: Syntaxfehler: 'for'
    1>d:\test\getversion\getversion\getpathname.cpp(43): error C2143: Syntaxfehler: Es fehlt ')' vor ';'
    1>d:\test\getversion\getversion\getpathname.cpp(43): error C2143: Syntaxfehler: Es fehlt ';' vor '!='
    1>d:\test\getversion\getversion\getpathname.cpp(43): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    1>d:\test\getversion\getversion\getpathname.cpp(43): error C2059: Syntaxfehler: '++'
    1>d:\test\getversion\getversion\getpathname.cpp(43): error C2059: Syntaxfehler: ')'
    1>d:\test\getversion\getversion\getpathname.cpp(43): error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil?
    1>d:\test\getversion\getversion\getpathname.cpp(53): error C2059: Syntaxfehler: '}'
    1>d:\test\getversion\getversion\getpathname.cpp(53): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    1>d:\test\getversion\getversion\getpathname.cpp(53): error C2059: Syntaxfehler: '}'
    1>
    1>Fehler beim Erstellen
    1>
    1>Verstrichene Zeit 00:00:00.27
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    

    danke für die hilfe bisher, ich konnte die syntaxfehler nicht selbst lösen das scheinen evtl. folgefehler zu sein? den code habe ich mit ausnahme der änderung belassen.



  • Ich hab fast alles gelöst:

    extern char      GetPathName    // > error code
    (
     char           *pszFileName,           // < Filename Objekt
     char           *pszSearchString,       // < Suchstring
     CString&       strResultString,         // > Resource String
     char			strSearchPath
    
     )
     ;
    
    auto folders = getFolders(_T("C:\\Program Files (x86)\\Adobe\\"));
    
    auto f = begin(folders);
    {
    for (f != end(folders); f++)
    {
        std::tstring dummy;
        std::tstringstream ss(f);
        int version;
        if (ss >> dummy >> version){
            if (dummy == _T("Reader")){
                MessageBoxA(0, std::to_string(version).c_str(), "Version:", MB_ICONEXCLAMATION);
            }
        }
    }
    }
    
    1>d:\test\getversion\getversion\getpathname.cpp(46): error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil?
    1>
    1>Fehler beim Erstellen
    1>
    1>Verstrichene Zeit 00:00:00.27
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    


  • Sieht so aus, als wärst du mit C++/CLI unterwegs. Das ist eine andere Sprache als C++. Ich habe keine Ahnung wie man dort eine for-Schleife oder überhaupt irgendwas macht. Dafür gibts aber leicht verständliche Anfängertutorials.



  • Ok, trotzdem vielen Dank.

    Was genau wird da eigentlich ausgegeben bzw. was passiert da?

    Soweit ich das verstehe wird jeder Ordner druchgegangen und nach "Reader" im Namen gesucht, bei erfolg wird in einer Messagebox "Version:" ausgegeben.
    Falls ja dann ist das nicht ganz richtig, dieser teil soll nicht die version herausfinden sondern in welchem ordner die AcroRd32.dll sich befindet.



  • *Push*

    std::vector<std::tstring> getFolders(const std::tstring &path){
        std::vector<std::tstring> files;
        WIN32_FIND_DATA WFD;
        HANDLE h = FindFirstFile(path.c_str(), &WFD);
        if (h == INVALID_HANDLE_VALUE)
            return files;
        do if (WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            files.push_back(WFD.cFileName);
        while (FindNextFile(h, &WFD));
        FindClose(h);
        return files;
    }
    
    auto folders = getFolders(_T("C:\\Program Files (x86)\\Adobe\\"));
    for (auto f = begin(folders); f! = end(folders); f++)
    {
        std::tstring dummy;
        std::tstringstream ss(f);
        int version;
        if (ss >> dummy >> version){
            if (dummy == _T("Reader")){
                MessageBoxA(0, std::to_string(version).c_str(), "Version:", MB_OK);
    
            }
        }
    }
    

    Was wird alles in der Messagebox ausgegeben und was bedeuten die einzelnen zeilen?
    Einen Teil konnte ich mir zusammenreimen, aber nicht alles.
    Laufen möchte es noch immer nicht 😞



  • Das Problem ist, dass ich es nicht weiß. Ich kann dir sagen was es in C++ bedeutet, aber nicht was es in C++/CLI bedeutet. Die Sprachen sind so ein bisschen ähnlich, aber nicht gleich.

    Ein vector ist sowas ähnliches wie ein Array, nur mit dynamischer Länge. getFolders nimmt einen String path und gibt dir einen vector (Array, Menge, Liste) von Ordnernamen in diesem Pfad zurück und benutzt dafür die Winapi. Da du Visual Studio benutzt solltest du auf einen beliebigen nicht selbst geschriebenen Teil des Codes klicken können, F1 drücken und die online-Hilfe für die entsprechende Funktion bekommen.

    auto bedeutet, dass er sich den Datentyp selbst festlegen soll. auto folders = getFolders(...); legt eine neue Variable folders vom Typ des Rückgabetyps von getFolders an, was zufällig ein vector<tstring> ist.

    Dann gehen wir alle Ordner durch und zerlegen den Namen in einen String und einen int. Bei "Reader 10.0" wäre das der String "Reader" und int 10. Damit kennen wir jetzt die Version. Dann wird die MessageBox aufpoppen, wahrscheinlich "Version: 9", "Version: 10", ....

    Da wir nun die Versionen kennen, können wir die getFolders-Funktion anpassen und eine getFiles-Funktion draus machen, halt statt "WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY" ein "!(WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)" hinschreiben, dann bekommen wir die Dateien.

    Ein paar Strings mit + zusammenfügen, also

    _T("C:\\Program Files (x86)\\Adobe\\") + f + _T("\\Reader\\")
    

    wobei f der aktuelle Ordnername aus der for-Schleife ist. Dann mit diesem Pfad getFiles aufrufen, durch alle Files genauso wie bei folders iterieren und prüfen, ob "AcroRd32.dll" dabei ist.

    Die kleinen sprachlichen Unterschiede werden das schwieriger als nötig machen. Du kannst ein neues Programm schreiben, dass das in C++ macht, dann kann dir auch wer helfen. Und dann rufst du von CLI aus einfach das Programm auf. Oder du fragst jemanden, der C++/CLI kann, denn ich bin mir mittelmäßig sicher, dass ordentliches C++ miserables C++/CLI ist.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • nwp3 schrieb:

    Sieht so aus, als wärst du mit C++/CLI unterwegs. Das ist eine andere Sprache als C++. Ich habe keine Ahnung wie man dort eine for-Schleife oder überhaupt irgendwas macht. Dafür gibts aber leicht verständliche Anfängertutorials.

    Wie kommst du den da drauf? Das ist nicht C++/CLI sondern C++ unter Benutzung der Windows API.
    @SeppJ, wenn schon dann ins WinAPI Forum. Vermutlich aber nicht mal das, denn es sind ja Syntax-Errors...


Anmelden zum Antworten