Verzeichnis auslesen - mit Angabe der Startverzeichnisses

Spagetti_Eis

Grünschnabel
Hallo,

ich hab ein ganz ähnliches Problem wie Dipsi unter "Bilder aus Verzeichnis auslesen" und dein Quellcode Langer1801 hat mir schon viel weiter geholfen :)
Ich möchts nämlich ein Verzeichnis, das ich über die Kommandozeile übergeben bekomme, auslesen. Ich habe die Kommandozeile schon geparst und den Pfad in einem CString gespeichert.
Mein Problem ist nun: Wie bringe ich es dem FindFile bei, daß es nicht das Verzeichnis ausliest, unter dem mein Programm liegt, sondern das Verzeichnis, das ich von der Kommandzeile bekomme? Kann ich irgendwie einen Anfangspfad übergeben?

Vielen Dank schon im Voraus


Hier noch etwas Quellcode von mir:
strFilePath = cmdInfo.m_rgstrParameter.GetNext(pos);

CFileFind finder;
CStringArray strFiles;
CString strSingleFile;

// solange ein File des angegebenen Typs gefunden wird, ist bWorking TRUE
BOOL bWorking = finder.FindFile("*.doc");
while (bWorking)
{
bWorking = finder.FindNextFile();

strSingleFile = finder.GetFileName();
strFiles.Add(strSingleFile);
}
 
Hi, wenn du in der MSDN unter CFileFind nachschaust, findest du folgendes Beispiel:
Code:
  CFileFind finder;
   BOOL bWorking = finder.FindFile("*.*");
   while (bWorking)
   {
      bWorking = finder.FindNextFile();
      cout << (LPCTSTR) finder.GetFileName() << endl;
   }
wobei du bei "finder.FindFile("*.*")" den Pfad zu deinem Verzeichnis übergeben mußt. Danach kannst über "FindNextFile" die Dateien auslesen.

Mfg

langer
 
Ja, so klappt es !!
Einfach die Pfadangabe mit übergeben.

Viele Dank langer1801 und CodeFatal :p

Mein Quellcode sieht nun so aus und funktioniert:

strFilePath = cmdInfo.m_rgstrParameter.GetNext(pos);

CString strPathFileType;

// dem Dateipfad die Angabe der gesuchten Dateiart hinzufügen
strPathFileType = strFilePath + "*.doc";

CFileFind finder;
CStringArray strFiles;
CString strSingleFile;

// solange ein File des angegebenen Typs gefunden wird, ist bWorking TRUE
BOOL bWorking = finder.FindFile(strPathFileType);
while (bWorking)
{
bWorking = finder.FindNextFile();

strSingleFile = finder.GetFileName();
strFiles.Add(strSingleFile);
}
 
Moin moin,

schau dir mal noch folgende Funktionen an:
Code:
CFileFind::IsDirectory()
CFileFind::IsDots()
CFileFind::IsSystem()
Wirst schnell merken, das Ordner wie "RECYCLER" und "System Volume Information" zu beachten sind. :suspekt:

Gruss Michael

P.S.: Nutz mal die Code-Tags :)
 
Ja hab ich auch gemerkt :)

mein Code sieht nun so aus:
strFilePath = cmdInfo.m_rgstrParameter.GetNext(pos);

CString strPathFileType;

// dem Dateipfad die Angabe der gesuchten Dateiart hinzufügen
strPathFileType = strFilePath + "*.*";

CFileFind finder;

// solange ein File des angegebenen Typs gefunden wird, ist bWorking TRUE
BOOL fWorking = finder.FindFile(strPathFileType);

// die gefundene Datei dem CStringArray hinzufügen
while (fWorking)
{
fWorking = finder.FindNextFile();

strFileName = finder.GetFileName();

// "." ".." und Verzeichnisses ausschließen
if(finder.IsDots() == 0 && finder.IsDirectory() == 0)
{
// Pfad vor Dateiname einfügen
strSingleFile = strFilePath + strFileName;
strFiles.Add(strSingleFile);
}
}

Aber ich hab nun noch ein anderes Problem...

ich hatte erwartet, daß ich von der Registry den Pfad des ausgewählten Verzeichnisses (das ich im KontextMenü markiere) über %0 bekomme, aber anscheinend nicht. Bei einem einzelnen File ging das mit %0. Was muß ich anstatt %0 reinschreiben, damit mit der Pfad übergeben wird?

Meine Registry sieht so aus:
[HKEY_CLASSES_ROOT\Directory\shell\test]
@="alle Dateien des Verzeichnisses"
[HKEY_CLASSES_ROOT\Directory\shell\test\command]
@="D:\\irehet\\test\\Debug\\test.exe s %0 e dir"
(die Parameter s e und dir hab ich selbst definiert und sollen so bleiben)
 
Ach du grüne neune...
Nur zum Verständnis: Du bekommst einen String übergeben.
In diesem String steht irgendwo ein Startpfad (z.b. c:\Programme\)
Diesen Startpfad Speicherst du in einem anderen String.
Nutzt dann CFileFind um alle Dateien zu finden

Soweit kann ich das nachvoll ziehen. Aber bei den Regestry einträgen müssteste mir mal auf die Sprünge helfen. Stehen da alle Verzeichnisse der Reihe nach drin oder sind die irgendwie zusammen gewürfelt? Falls du alle Dateien in einem Verzeichnis finden willst, inkl. Unterordner

müssteste deine Funktion rekursiv verwenden.
Code:
//Hier mal ne globale Variable
CStringList strFiles;//oder was das sonst ist

void ichfindealles(CString strpPathFileType)
{
CFileFind finder;

// solange ein File des angegebenen Typs gefunden wird, ist bWorking TRUE
BOOL fWorking = finder.FindFile(strPathFileType);

// die gefundene Datei dem CStringArray hinzufügen
while (fWorking)
{
    CString strFileName, strSingleFile;
     fWorking = finder.FindNextFile();
     strFileName = finder.GetFileName();
     // "." ".." und Verzeichnisses ausschließen
     if(finder.IsDots())
         continue;
     if(finder.IsDirectory())
     {
          ichfindealles(finder.GetFilePath());
          continue;
     }
     // Pfad vor Dateiname einfügen
     strSingleFile = strFilePath + strFileName;
     strFiles.Add(strSingleFile);
}
}
Dürfte so . Bei Fehlern fragen sie Ihren Compiler und Debugger:)

Gruss Michael

p.S.: klick mal auf zitieren und schau mal an wie die CODE-Tags gemacht werden.
 
Erstmal danke dür die Antwort Michael ;-)

jetzt weiß ich auch was du mit "CodeTags" meinst :-( bin ja noch ein Grünschnabel...

Zu deiner Antwort: ne, die Funktion funktioniert schon so einwandfrei und liest mir brav alle Dateien des Verzeichnisses aus (ich hab zum testen einfach über Projekt-Settings dem Debugger die Programm-Parameter übergeben). Sie braucht nicht rekurisiv zu sein, da ich nur die Dateien unter diesem Verzeichnis haben will und nicht noch eine Ebene tiefer (in Unterverzeichnisse) gehen will.

Generell möchte ich meinem Programm entweder über das Kontextmenü EINE Datei übergeben oder (indem man einen ORDNER markiert) ALLE Dateien dieses Ordners übergeben. Mein Programm läuft dann völlig ohne Benutzerinteraktion ab. Mit einer Datei hats schon gut geklappt, da mußte ich in der Registry folgende KEys anlegen:
Code:
[HKEY_CLASSES_ROOT\Word.Document.8\shell\test]
@="test starten"
[HKEY_CLASSES_ROOT\Word.Document.8\shell\test\command]
@="D:\\irehet\\test\\Debug\\test.exe s %0"

Hier wird mit %0 der Dateiname sammt Pfad übergeben und kann dann ausgelesen werden.

Ich hatte vermutet, daß das bei Verzeichnissen genauso funktioniert und mein Programm so programmiert, daß es einen Pfad übergeben bekommt. Mit %0 geht das aber anscheinend nicht. Es gibts so Sachen wie %SystemRoot% und so. Irgendetwas in der Art müßte es sein. Ich bin auch noch ein blutiger Registry-Neuling und kenn mich da nur sehr wenig aus...
 
Von den Regestries hab ich wie gesagt null Plan, wieso bist du überhaupt darauf angewiesen?
Wo kommen die Dinger her?
Greifst du da auf Teile vom Explorer zu oder was ist da Sache?

Vielleicht kann ich dir noch was helfen, wenn ich das mit den Reg's verstehe.
Formulier doch mal deine gesamt Aufgabe:) Vielleicht erkennt man dann einen anderen Ansatz.
Michael
 
ARRRRGGGHHH ICH HABS! :eek:

Ich war die ganze Zeit richtig! Mit %0 wird auch bei Verzeichnissen der Pfad übergeben - ABER IHM FEHLT DER ABSCHIESSENDE \ Statt "D:\irehet\bla\" habe ich nur "D:\irehet\bla" bekommen !! So konnte mein Programm den Dateipfad nicht richtig zusammen setzen und hat deshalb auch nichts gemacht. Einfach dem übergeben Pfad ein "\" anghängt undschon gehts.

Ich glaub jetzt brauch ich nen Schnaps...

Viele Dank Michael für deine prompte Hilfe ;)

__________JUHUU_________JUHUU_________JUHUU_________JUHUU_________
 
Zurück