Auf ein Verzeichnis zugreifen und Dateien suchen



  • Ok vielen Dank 😉



  • Hi,

    schmau dir mal die Funktionen

    HANDLE WINAPI FindFirstFile(
      __in   LPCTSTR lpFileName,
      __out  LPWIN32_FIND_DATA lpFindFileData
    );
    

    http://msdn.microsoft.com/en-us/library/windows/desktop/aa364418(v=vs.85).aspx

    BOOL WINAPI FindNextFile(
      __in   HANDLE hFindFile,
      __out  LPWIN32_FIND_DATA lpFindFileData
    );
    

    http://msdn.microsoft.com/en-us/library/windows/desktop/aa364428(v=vs.85).aspx

    an. Damit ist es relativ leicht lösbar.

    Gruß
    Ombre



  • Ganz schön kompliziert das Ganze 🙂

    Jetzt hab ich folgendes gemacht:
    Ich hab mir heut mit Visual Studio ein kleines Programm geschrieben...erstmal ohne Schleifen usw. Es geht erstmal nur ums Grundprinzip.

    Dieses Programm soll mir per CMD einen neuen Ordner anlegen, ein Verzeichnis auslesen, dieses im neu erstellten Ordner als Textdokument speichern.
    Danach die Textdatei zum lesen öffnen und wenn ich sie per Klick geschlossen habe, fragen ob die Datei gespeichert werden soll oder nicht.
    Klappt alles wunderbar, aber...
    Wenn ich es starte dann kommt eine Fehlermeldung das die Datei nicht gefunden wurde.
    Dabei ist es egal ob die Textdatei neu geschrieben wird oder diese schon existiert.
    Ich poste mal den Code und mach die Stelle kenntlich wo dann die Fehlermeldung kommt:

    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    
    using namespace std;
    
    int main ()
    {
      int i;
      i=system ("cd C:\\");
    
      cout << "Ordner anlegen" << endl;
      i=system ("md C:\\Textordner\\");
    
      cout << "Verzeichnis auslesen und in Textdatei schreiben" << endl;
      i=system ("dir C:\\*.* -> C:\\Textordner\\Ausgabe.txt");
    
    [b][u]//An dieser Stelle kommt die Fehlermeldung: Datei nicht gefunden[/u][/b]
    
      cout << "Textdatei oeffnen" << endl;
      i=system ("C:\\Textordner\\Ausgabe.txt");
    
      cout << "Textdatei loeschen" << endl;
      i=system("del C:\\Textordner\\*.txt /P");
    
      return 0;
    }
    

    Wo liegt der Fehler? Was hab ich falsch gemacht bzw. übersehen?
    Datei nicht gefunden -> aber sie ist doch da 😕



  • statt -> >>
    Nimm lieber die API-Funktionen



  • yazzi2010 schrieb:

    Wo liegt der Fehler? Was hab ich falsch gemacht bzw. übersehen?

    Lass das mit dem C-Compiler und schreib den Kram in eine BAT oder CMD Datei,
    oder lerne Systemaufrufe zu verwenden. In diesem Fall die Kombination aus
    FindFirstFile() und FindNextFile() ...

    Wenn es zu kompliziert ist den Code aus der MSDN-Hilfe rauszukopieren wäre
    eine Batch-Datei in diesem Fall auch möglich.

    Die Verwendung von System hat einfach zu viele Nachteile ...

    Wenn die angegebene Stelle wirklich die Fehlerstelle ist wird er wohl am ->
    liegen.



  • #include <windows.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    WIN32_FIND_DATA data;
    HANDLE hFind;
    LPCTSTR FileName="c:\\my folder//*" ; // Listet alle Dateien in c:\my_folder auf
    bool ret;
    
        hFind = FindFirstFile( FileName ,  &data);
    
        do
        {
    
            cout<<data.cFileName<<endl;
    
        }
        while ( FindNextFile( hFind, &data) != 0  );
    
        FindClose(hFind);
    
    return 0;
    }
    

    Die Punkte die mit ausgegebn werden darfst du selber rausfiltern das ist ganz einfach. Was für Punkte? Teste das Programm halt.

    Btw. du solltest auch sicherstellen das der Pfad existiert ansonsten bekommst du logischerweise eine falsche Ausgabe.^^



  • _D sagte in Auf ein Verzeichnis zugreifen und Dateien suchen:

    LPCTSTR FileName="c:\my folder//*" ; // Listet alle Dateien in c:\my_folder auf

    Leider bekomme ich immer folgenden Fehler das ein Wert vom Typ const char* nicht zum initialisieren einer Entität vom Typ LPCTSTR verwendet werden kann. Was soll mir dieser Fehler sagen? LPCTSTR braucht doch ein const char*. Ich verstehe das Problem nicht. Hätte hier jemand eine schlaue Idee?



  • @Ollom Unicode eingeschaltet?



  • Wie meinst du das? Soll ich noch mal _UNICODE; hinschreiben? Das sollte ja eigentlich schon in der Lib geschehen sein. Ansonsten nutze ich VS2017 und da habe ich keine entsprechende Einstellung gefunden...



  • Das T in LPCTSTR steht für TCHAR.

    const TCHAR* FileName = TEXT("c:\\my folder\\"); // beachte Escapesequenzen
    

    TCHAR ist abhängig von den Einstellungen (UNICODE definiert oder nicht, zu finden in den Projekteinstellungen) entweder ein char oder ein wchar_t. Das TEXT-Makro setzt bei UNICODE ein L vor das Stringliteral.
    Es gibt drei Möglichkeiten: char verwenden und nur die A-Versionen aus der WinAPI nehmen, wide chars verwenden und nur die W-Versionen nehmen oder eben TCHARs und das TEXT-Makro verwenden.