Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » C++ Findnextfile

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
05.06.2003, 16:22 Uhr
ai-tee



Folgendes Problem:

Mein Programm ist wie folgt aufgebaut:


C++:
while (...)
{
FindFirstFile (...)
FindNextFile (...)
...
FindFirstChangeNotification (...)
WaitForSingleObject (...)
}



Die erste Runde in der Schleife klappt einwandfrei ... er listet mir schön alle Dateien auf und führt aus, was er ausführen soll ... dann geht er in den Wait.
Damit fängt das Chaos an.
Füge ich dem Directory nun ein neues File hinzu gehts wie folgt weiter:


C++:
while (...)
{
FindFirstFile (...)
FindNextFile (...)
...
}



Dann stoppt er.
Zunächst funktioniert FindNextFile noch und ich kriege die "Dateinamen":

"."
".."

Aber anschliessend kriege ich ERROR_NO_MORE_FILES als Rückgabewert.

Hat jemand eine Idee woran das liegen könnte?
--
Greetz, ai`tee
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.06.2003, 16:43 Uhr
ai-tee



Hmm ... aus irgendeinem Grund bleibt der Wert (18 wenn Error) von GetLastError während des gesamten Programms auf 18 sobald er diesen Status einmal erreicht hat.

Ich habs nun etwas unschön gelöst, in dem ich den Wert mit der Funktion SetLastError() am Anfang der Schleife jedesmal auf 0 setze.

Wenn jemandem noch ne bessere Lösung einfällt, wäre es schön. Und ganz besonders interessiert mich warum dann die Funktion noch den ersten "Dateinamen" ("..") zurückgibt.
--
Greetz, ai`tee
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.06.2003, 17:02 Uhr
Tommix



Hallo,
"." und ".." sind das aktuelle und das übergeordnete Verzeichnis. Die werden bei "DIR" in der Konsole auch angezeigt, wenn du in einem Unterverzeichnis bist. Wenn Du ein bisschen mehr Code postest, könnte man das eigentliche Problem besser nachstellen...

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.06.2003, 17:18 Uhr
Tommix



.. ich noch mal:

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

int main()
{
    WIN32_FIND_DATA findData;

    while (TRUE)
    {
        HANDLE find = FindFirstFile ("*.*", &findData);

    while(FindNextFile(find, &findData))
    {
        std::cout << findData.cFileName << std::endl;
    }
        
    HANDLE change =
        FindFirstChangeNotification(".", FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE);

    WaitForSingleObject(change, INFINITE);
    }
    return 0;
}



So geht's im Prinzip (Abbruchbedingung fehlt noch und überwacht wird das aktuelle Verzeichnis).

Gruss, Tommix

Dieser Post wurde am 05.06.2003 um 17:18 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.06.2003, 17:20 Uhr
ai-tee



Weiss ja net, ihr lacht mich bestimmt aus :P

Ja, wg. "." und ".." weiss ich bescheid ... deswegen stand ja auch immer "Dateinamen" dort in GFüsschen ^^

Mal abgesehen davon, dass mich wundert dass FindFirstFile und FindNextFile diese überhaupt auflisten.

Zum Code zurück ich poste einfach mal alles ... er ist noch nicht fertig, also nicht wundern, aber so wie er bisher ist (mit Mogellösungen) funktioniert er:


C++:
#include "stdafx.h"

// ----------------------------------------------------------------------------

#include <iostream.h>
#include <afx.h>

// --- main -------------------------------------------------------------------

void main(int argc, char *argv[ ])
{
    int noEndLoop = 1;                      // Counter
    int dotCounter = 0;                     // Zählt die Punkte im Dateinamen
    int waitForNotif = 0;                    // Bei 1 is WaitForSingleObject true
    int err = 0;                                 // Fehlerprüfung von FindNextFile bei 0 ist
                                                   // kein File mehr im Dir vorhanden
    char currentDir[1024] = "";           // Speichert den aktuellen Pfad
    char fileName[1024] = "*";           // Dateiname (hier Wildcard) an FindFirstFile
    bool watchSubtree = false;          // True inkl. Subdirs, False für current Dir
    WIN32_FIND_DATA fileData;         // Detaildaten der im Dir gefundenen Dateien
    CString dirFileNames = "";            // Liste aller Files im current Dir

/* Aktuelles Verzeichnis wird geholt und in einer Variablen gespeichert */

    GetCurrentDirectory (sizeof (currentDir), currentDir);
        
    while (waitForNotif == 0)
    {
        SetLastError(0); // Nach dem 1. Durchlauf muss die ErrMsg reseted werden

/* Aus dem Verzeichnis wird der erste Dateiname geholt */

        HANDLE searchFirstFile = FindFirstFile (fileName, &fileData);

/* Mittels Schleife werden die restlichen Dateinamen geholt */

        while (err == 0)
        {
            BOOL searchNextFile = FindNextFile (searchFirstFile, &fileData);
        
            /* Wenn keine Datei mehr vorhanden, entsprechenden Rueckgabewert setzen */

            if (GetLastError () == ERROR_NO_MORE_FILES)
            {
                err = 1;
            }
            
            /* Abfangen das die letzte Datei nicht doppelt aufgeführt wird */

            if (err == 0)
            {
                CString tmpFileName = fileData.cFileName;
                
                if (tmpFileName.Right(3) == ".ps")
                {
                    system ("C:\\Programme\\gs-706\\gs7.06\\lib\\ps2pdf testps1.ps");
                    cout << system ("C:\\Programme\\gs-706\\gs7.06\\lib\\ps2pdf testps1.ps") << endl;
                    cout << "ps Datei gefunden: " << tmpFileName << endl;
                }
            } // End of if (err == 0)
        } // End of while (err == 0)
        
/* Das Verzeichnis wird auf weitere Änderungen überwacht */
    
        HANDLE firstChangeNotif = FindFirstChangeNotification
            (currentDir, watchSubtree, FILE_NOTIFY_CHANGE_FILE_NAME);
                
        DWORD waitForFirstChangeNotif = WaitForSingleObject (firstChangeNotif, INFINITE);
    
        if (waitForFirstChangeNotif == WAIT_OBJECT_0)
        {
            waitForNotif = 0;
        }
        else
        {
            waitForNotif = 1;
        }
    }
};


--
Greetz, ai`tee

Dieser Post wurde am 05.06.2003 um 17:22 Uhr von ai-tee editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.06.2003, 17:30 Uhr
ai-tee



Dein Code ist mal wirklich hart und ich muss gestehen, ganz schön deprimierend ... aber der überwacht das Verzeichnis nur auf einen "Change" und dann wird das Programm beendet, oder?

Warum benutzt Du für cout den Klassenaufruf?
--
Greetz, ai`tee

Dieser Post wurde am 05.06.2003 um 17:30 Uhr von ai-tee editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
05.06.2003, 21:22 Uhr
Tommix



Hallo,

Zitat:
Dein Code ist mal wirklich hart und ich muss gestehen, ganz schön deprimierend ...




Zitat:

aber der überwacht das Verzeichnis nur auf einen "Change" und dann wird das Programm beendet, oder?



Nein, jedesmal, wenn sich in dem Verzeichnis was ändert, wird der Inhalt ausgegeben. Das Ding ist wie schon gesagt eine Endlosschleife.
Wass soll es denn machen?


Code:
Warum benutzt Du für cout den Klassenaufruf?



Du meinst std:: ? Das ist keine Klasse, sondern ein namespace. Muß ich machen, da ich
C++:
using namespace std;
weggelassen habe.

Deinen code zieh' ich mir heut nicht mehr rein, war'n harter Tag (32°C Bürotemperatur).
Gruss, Tommix

Dieser Post wurde am 05.06.2003 um 21:44 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
06.06.2003, 09:07 Uhr
ai-tee



Hmm ... aber wieso kann ich denn cout ohne using namespace benutzen? Oder hab ich dafür extra was includiert?
--
Greetz, ai`tee
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
06.06.2003, 10:02 Uhr
Tommix



Du nimmst <iostream.h> (alte Form ohne namespace) und ich <iostream>.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
06.06.2003, 10:54 Uhr
ai-tee



Achso dann ist ja alles klar ... ist es denn dann nicht sinnvoll immer iostream.h zu benutzen? Ist ja erheblich weniger Schreibaufwand

32° Bürotemperatur? Hmm haben wir bestimmt getoppt (rundum Glasfassade und keine Klimaanlage)

Warum Dein Code hart ist? Weil er so um 60% kürzer ist? :P
Hab meinen jetzt auch gekürzt ... einige Dinge waren wirlich etwas umständlich ... :P
--
Greetz, ai`tee
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: