Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Datei bzw. Dateipfad ermitteln

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 < [ 2 ]
000
30.07.2007, 12:31 Uhr
~abrissbirne
Gast


Hallo,
wie kann ich mittels Visual C++ eine Datei bzw. deren Pfad ermitteln? Gibt es eine Funktion die mir den Rechner "scanned" bis er die richtige Datei gefunden hat?

Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.08.2007, 09:45 Uhr
~abrissbirne
Gast


Kann ich mit GetPathName() meinen Rechner durchsuchen?

Ich möchte nicht, dass der Benutzer die Datei selbst suchen muss (kein Datei Öffnen Dialog). Ich suche eine bestimmte Datei mit unbekanntem Speicherort und will diesen Pfad in eine Variable speichern. So ähnlich wie eine Windows Suche"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.08.2007, 10:27 Uhr
Tommix



Hallo,
CFileFind ist, was Du suchst.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.08.2007, 11:38 Uhr
~abrissbirne
Gast


Ok, hab mal nachgeforscht.

Wenn ich so etwas Programmiere:

Code:

CFileFind find;
CString Result = find.FileFind("\\*.mak");



Steht das in meinem String:

Code:

Result {???}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.08.2007, 12:35 Uhr
Tommix




C++:
CFileFind find;
BOOL foundSomething = find.FindFile("\\*.mak");

while (foundSomething)
{
    foundSomeThing = find.findNextFile();
    ::MessageBox(0, find.GetFilePath(), "Gefunden:", MB_OK);
}


Für Dein Problem mußt du aber *.* suchen und dann die Unterverzeichnisse (zu erkennen an find.IsDirectory() && !find.IsDots()) rekursiv auch wieder durchsuchen.

- Tommix

Dieser Post wurde am 01.08.2007 um 12:36 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.08.2007, 14:46 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


wichtig ist vor allem erstmal find.findNextFile aufzurufen, bevor man was abruft.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.08.2007, 09:43 Uhr
~abrissbirne
Gast


Danke schonmal für diese schnelle Hilfe.
Hab mal folgenden Code aufgesetzt:


Code:

CFileFind finder;

CString strfound;
CString strWildcard;
strWildcard = ("\\*.*");

BOOL bWorking = finder.FindFile(strWildcard);

while (bWorking)
{
     bWorking = finder.FindNextFile();

     if (finder.IsDirectory())
     {
          CString str = finder.GetFileName();
          MessageBox(str, " Directory found", MB_ICONINFORMATION);
          if (str == "Programme")
          {
                strfound = finder.GetFilePath();
                BOOL bWorkingNext = finder.FindFile(found + "\\*.*);

                while (bWorkingNext)
                {
                      ...
                }
           }
     }
     finder.Close();
}



Jetzt findet er Verzeichnisse auf dem aktuellen Laufwerk (in meinem Fall D. Das heisst ich könnte jetzt nach dem Ordner Programme suchen. Diesen dann auf National Instruments. Diesen dann wieder auf ...
Kann ich nich alle Unterverzeichnisse direkt in meiner Suche aufnehmen? Ich kann ja nicht wissen, wo jeder LabView installiert hat. Und ich habe eine Partitionierte Festplatte und stehe da bestimmt auch nicht alleine da. Wie kann ich also sagen, dass meine gesamten Festplatten nach dem Ordner xyz durchsucht wird?

Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.08.2007, 10:31 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
sowas macht man rekursiv:


C++:
CStringArray &Find(CString strDir, CStringArray &strList)
{
    CFileFind finder;
    CStringArray strFiles;
    
    CString strfound;
    CString strWildcard;
    strWildcard = (strDir+"\\*.*");
    
    BOOL bWorking = finder.FindFile(strWildcard);
    
    while (bWorking)
    {
        bWorking = finder.FindNextFile();
        
        if (finder.IsDirectory())
        {
            if(strList.GetAt(0) == finder.GetFileName())
            {
                strList.RemoveAt(0);
                return Find(finder.GetFilePath(), strList);
            }
        }
        else
            strFiles.Add(finder.GetFilePath());
    }
    finder.Close();
    return strFiles;
}



ungetestet, aber du kannst das ganze dann so in der Art aufrufen:


C++:
CStringArray strList = {"Programme", "National Instruments", ... };
CStringArray strFiles = Find("C:\\", strList);



und in strFiles kriegst du alle Dateien in den jeweiligen Ordnern aufgelistet die er durchläuft.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
02.08.2007, 13:58 Uhr
~abrissbirne
Gast


Mal ganz langsam. Ich drösel das mal auf.


Zitat von FloSoft:
Hi,
sowas macht man rekursiv:


C++:
CStringArray &Find(CString strDir, CStringArray &strList)
[/quote]

Diese Zeile blick ich nicht!

[quote FloSoft]
{
    CFileFind finder;
    CStringArray strFiles;
    
    CString strfound;
    CString strWildcard;
    strWildcard = (strDir+"\\*.*");
    
    BOOL bWorking = finder.FindFile(strWildcard);
[/quote]

Ok, verstehe ich!

[quote FloSoft]
    while (bWorking)
    {
        bWorking = finder.FindNextFile();
        
        if (finder.IsDirectory())
        {
            if(strList.GetAt(0) == finder.GetFileName())
            {
                strList.RemoveAt(0);
                return Find(finder.GetFilePath(), strList);
            }
[/quote]

Die Zweite If Schleife, was soll die machen? Wenn Das erste Objekt in strList Array gleich dem aktuellen Dateinamen ist, entferne es aus dem Array und return ???

[quote FloSoft]
        }
        else
            strFiles.Add(finder.GetFilePath());
    }
    finder.Close();
    return strFiles;
}



ungetestet, aber du kannst das ganze dann so in der Art aufrufen:



ansonsten füge den Aktuellen Dateipfad in strFiles Array.


Zitat von FloSoft:


C++:
CStringArray strList = {"Programme", "National Instruments", ... };
CStringArray strFiles = Find("C:\\", strList);



und in strFiles kriegst du alle Dateien in den jeweiligen Ordnern aufgelistet die er durchläuft.


Ich dachte ich erhalte in meinem CStringArray Dateinamen und muss diese nicht vorher initialisieren. Oder verstehe ich das hier grad komplett falsch?

Wenn ich den Code mal kompiliere, dann bekomme ich 4 Fehlermeldungen und eine Warnun:

Code:

error C2552: 'strList' : Initialisierung nicht zusammengesetzter Typen mit Initialisierungsliste ist nicht möglich
error C2065: 'Find' : nichtdeklarierter Bezeichner
error C2440: 'initializing' : 'int' kann nicht in 'class CStringArray' konvertiert werden
     Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Ueberladungsaufloesung des Konstrukors ist mehrdeutig
error C2373: 'Find' : Neudefinition; unterschiedliche Modifizierer
warning C4172: Adresse einer lokalen Variable oder eines temporaeren Wertes wird zurueckgegeben

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
02.08.2007, 22:47 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja hab das so vom prinzip gebaut das du dem einen pfad geben kannst - den er absucht (und nur den)

wenn du alle Dateien auflisten willst: nimm das hier: (so sollte es auch passen, zumindest wenn du ERST die Funktion definierst und dann weiter unten aufrufst, daher dieser "Neudefinition" und "nichtdeklarierter Bezeichner".


C++:
CStringArray &Find(CString strDir, CStringArray &strFiles)
{
    CFileFind finder;
  
    CString strfound;
    CString strWildcard;
    strWildcard = (strDir+"\\*.*");
    
    BOOL bWorking = finder.FindFile(strWildcard);
    
    while (bWorking)
    {
        bWorking = finder.FindNextFile();
        
        if (finder.IsDirectory())
        {
                return Find(finder.GetFilePath(), strFiles);
        }
        else
            strFiles.Add(finder.GetFilePath());
    }
    finder.Close();
    return strFiles;
}



Aufruf:

C++:
CStringArray strFiles;

// Dateien in C: suchen
Find("C:\\", strFiles);

// Dateien in suchreihenfolge (unsortiert!) ausgeben:
for(unsigned int i = 0; i < strFiles.GetCount(); ++i)
   std::cout << strFiles.GetAt(i);


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


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: