Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » FindFirstFile / FindNextFile WinAPI

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
29.12.2006, 15:27 Uhr
~stuard
Gast


Hallo,

ich versuche grade mir den Inhalt eines Ordners mit FindFirstFile und FindNextFile ausgeben zu lassen. Mit eher weniger Erfolg. Beim Root Laufwerk C: funktioniert das wunderbar. Sobald ich aber ein unterordner angeben kommt da nichts mehr bei rum und er gibt mir nur noch "Punkte" aus.

Hier mal mein Code:

C++:
#include "stdafx.h"
#include "windows.h"
#include <iostream>


int _tmain(int argc, _TCHAR* argv[])
{

    WIN32_FIND_DATA fileData;
    HANDLE            hFind;

    hFind = FindFirstFile(L"C:\\temp\\*", &fileData);
    
    std::wcout<<fileData.cFileName<<std::endl;

    FindNextFile(hFind, &fileData);

    std::wcout<<fileData.cFileName<<std::endl;

    return 0;
}


Was ist daran falsch, dass der Code nur bei beim Pfad C\* funktioniert?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.12.2006, 16:25 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
schon mal im Forum die Suche benutzt, oder im MSDN geschaut?
http://msdn2.microsoft.com/en-us/library/aa365200.aspx
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.12.2006, 18:12 Uhr
~stuard
Gast



Zitat von Uwe:
Hallo,
schon mal im Forum die Suche benutzt, oder im MSDN geschaut?
http://msdn2.microsoft.com/en-us/library/aa365200.aspx


ehrlich gesagt ja, zumindest bei MSDN hab ich geschaut. Die Seite die du verlinkt hast, hab ich auch gefunden. wobei diese mir nicht wirklich weiter geholfen hat.

Da steht ja auch nur man soll das * hinten dran hängen an den Pfad,wenn man den inhalt eines ordners haben will. Was ich ja auch gemacht hab. Nur leider tut sich da nichts.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.12.2006, 18:31 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
selbiger Quellcode aus meinem Link, den Kram mit der Parameterübergabe gelöscht und den Qellcode an 2 Stellen geändert.

C++:
#include <windows.h>
#include <stdio.h>
#include <malloc.h>
#include <tchar.h>
#include <wchar.h>
#include <strsafe.h>

#define BUFSIZE MAX_PATH
#define PATH "C:\\WINNT"

int _tmain(int argc, _TCHAR* argv[])
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind = INVALID_HANDLE_VALUE;
   DWORD dwError;
   LPTSTR DirSpec;
   //size_t length_of_arg;

   DirSpec = (LPTSTR) malloc (BUFSIZE);
  
   _tprintf (TEXT("Target directory is %s.\n"),PATH );

   // Prepare string for use with FindFile functions.  First,
   // copy the string to a buffer, then append '\*' to the
   // directory name.
   StringCbCopyN (DirSpec, BUFSIZE, PATH, 9);
   StringCbCatN (DirSpec, BUFSIZE, TEXT("\\*"), 2*sizeof(TCHAR));

   // Find the first file in the directory.
   hFind = FindFirstFile(DirSpec, &FindFileData);

   if (hFind == INVALID_HANDLE_VALUE)
   {
      _tprintf (TEXT("Invalid file handle. Error is %u.\n"),
                GetLastError());
      return (-1);
   }
   else
   {
      _tprintf (TEXT("First file name is: %s\n"),
                FindFileData.cFileName);
  
      // List all the other files in the directory.
      while (FindNextFile(hFind, &FindFileData) != 0)
      {
         _tprintf (TEXT("Next file name is: %s\n"),
                   FindFileData.cFileName);
      }
    
      dwError = GetLastError();
      FindClose(hFind);
      if (dwError != ERROR_NO_MORE_FILES)
      {
         _tprintf (TEXT("FindNextFile error. Error is %u.\n"),
                   dwError);
         return (-1);
      }
   }

   free(DirSpec);
   return 0;
}


Edit: Für Unterverzeichnisse einfach eine Function schreiben, die die UVZ rekursiv durchforstet und ausgibt.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 29.12.2006 um 18:34 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.12.2006, 16:44 Uhr
~stuard
Gast



Zitat von Uwe:
Hallo,
selbiger Quellcode aus meinem Link, den Kram mit der Parameterübergabe gelöscht und den Qellcode an 2 Stellen geändert.

C++:
#include <windows.h>
#include <stdio.h>
#include <malloc.h>
#include <tchar.h>
#include <wchar.h>
#include <strsafe.h>

#define BUFSIZE MAX_PATH
#define PATH "C:\\WINNT"

int _tmain(int argc, _TCHAR* argv[])
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind = INVALID_HANDLE_VALUE;
   DWORD dwError;
   LPTSTR DirSpec;
   //size_t length_of_arg;

   DirSpec = (LPTSTR) malloc (BUFSIZE);
  
   _tprintf (TEXT("Target directory is %s.\n"),PATH );

   // Prepare string for use with FindFile functions.  First,
   // copy the string to a buffer, then append '\*' to the
   // directory name.
   StringCbCopyN (DirSpec, BUFSIZE, PATH, 9);
   StringCbCatN (DirSpec, BUFSIZE, TEXT("\\*"), 2*sizeof(TCHAR));

   // Find the first file in the directory.
   hFind = FindFirstFile(DirSpec, &FindFileData);

   if (hFind == INVALID_HANDLE_VALUE)
   {
      _tprintf (TEXT("Invalid file handle. Error is %u.\n"),
                GetLastError());
      return (-1);
   }
   else
   {
      _tprintf (TEXT("First file name is: %s\n"),
                FindFileData.cFileName);
  
      // List all the other files in the directory.
      while (FindNextFile(hFind, &FindFileData) != 0)
      {
         _tprintf (TEXT("Next file name is: %s\n"),
                   FindFileData.cFileName);
      }
    
      dwError = GetLastError();
      FindClose(hFind);
      if (dwError != ERROR_NO_MORE_FILES)
      {
         _tprintf (TEXT("FindNextFile error. Error is %u.\n"),
                   dwError);
         return (-1);
      }
   }

   free(DirSpec);
   return 0;
}


Edit: Für Unterverzeichnisse einfach eine Function schreiben, die die UVZ rekursiv durchforstet und ausgibt.


Letzendlich macht der code doch auch nichts anderes als an den ordnernamen hinten das //* dranzuhängen und dann den Inhalt auszugeben.

Was ich doch eigentlich in meinem code auch gemacht hab, ist zwar noch hard drin, aber ich will den inhalt des Ordners C:/temp haben.
Also müsste der Pfad doch C\temp\\* im Programm lauten?!

Bei mir findet er dann aber keine dateien, wenn ich das was er findet ausgeben in der konsole ist das ein einfacher punkt(.).

Oder sehe ich jetzt den Wald vor lauter Bäumen nicht?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.12.2006, 18:09 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
Du musst Dein Verzeichnis in einer Schleife durchlaufen um die Dateien zu ermitteln.

C++:
while(FindNextFile(hFind, &fileData) != 0)
    std::wcout<<fileData.cFileName<<std::endl;


Weil:

Zitat von MS:

lpFindFileData
[out] Pointer to the WIN32_FIND_DATA structure that receives information about the found file or subdirectory.
The structure can be used in subsequent calls to FindNextFile to indicate from which file to continue the search.

The FindNextFile function continues a file search from a previous call to the FindFirstFile or FindFirstFileEx function....
If the function fails, the return value is zero (0)....


--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 30.12.2006 um 18:09 Uhr von Uwe editiert.
 
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: