CFile - nichtvorhandene Datei als Lesequelle



  • Hi Leute

    Heute brauch ich echt eure Hilfe... 3. Anfrage 😉

    Ich habe in meinem Programm die Möglichkeit Datensätze aus Dateien auszulesen. Diese Dateien können einfach in einem Textfeld angegeben werden. Leider hab ich das Problem, dass ich bei einer Funktion diese Dateien nur auslesen will, was dann ein Problem ist, wenn es die Datei nicht gibt. Beim Schreiben erzeug ich sie einfach, das ist ja klar; beim Lesen allerdings ist das nicht so einfach.

    Kann ich den Ordner auf die Anwesenheit dieser Datei überprüfen bevor ich sie öffne?



  • ich glaube wenn du eine datei öffnen willst, die nicht da ist, bekommste 'ne 'CFileException'



  • Kannst auch eine Funktion nehmen die das Vorhanden sein prüft z.b.

    bool FileExsist(CString sFile)
    {
        //check exsist of Filename
        WIN32_FIND_DATA FileData; 
        HANDLE hSearch; 
        hSearch = FindFirstFile(sFile, &FileData); 
        if (hSearch == INVALID_HANDLE_VALUE) 
        { 
            CString sText;
            sText.Format("File : %s not found", sFile);
            AfxMessageBox(sText);
            return false;
        }
    
        return true;
    }
    

    gruss
    Marcus


  • Mod

    UserMarcus schrieb:

    bool FileExsist(CString sFile)
    {
        //check exsist of Filename
        WIN32_FIND_DATA FileData; 
        HANDLE hSearch; 
        hSearch = FindFirstFile(sFile, &FileData); 
        if (hSearch == INVALID_HANDLE_VALUE) 
        { 
            CString sText;
            sText.Format("File : %s not found", sFile);
            AfxMessageBox(sText);
            return false;
        }
        
        return true;
    }
    

    Ein Beispiel von der schlechten Sorte:
    Wo ist der FindClose?

    PathFileExists ist viel einfacher!



  • Bin noch nicht so lang im Geschäft 🙂 und man lernt nie aus. 😉

    Danke für den Hinweis.

    gruss
    Marcus



  • Hab nochmal nachgedacht,
    was ist wenn ich es so mache bleibt dann ein HANDLE zurück ?

    bool FileExsist(CString sFile) 
    { 
        //check exsist of Filename 
        WIN32_FIND_DATA FileData; 
        if (FindFirstFile(sFile, &FileData) == INVALID_HANDLE_VALUE) 
        { 
            CString sText; 
            sText.Format("File : %s not found", sFile); 
            AfxMessageBox(sText); 
            return false; 
        } 
    
        return true; 
    }
    

    Nur zu meinem Verständnis.

    Besten Danke,
    gruss
    Marcus



  • In deinem Code ist immer noch kein FindClose. => Er ist immer noch falsch. 😉


  • Administrator

    Ich dachte wir sind hier im MFC Forum ^^

    CFile File;
    CFileException Exception;
    if(File.Open(strPath, CFile::modeRead, &Exception)
    {
        // Success ... File lesen.
    
        File.Close();
    }
    else
    {
        // Fehler ... Exception lesen
        if(Exception.m_cause == CFileException::fileNotFound)
        {
            // File wurde nicht gefunden.
        }
    }
    

    Das ganze geht auch mit Try und Catch.

    TRY
    {
        CFile File(strPath, CFile::modeRead);
        // ...
    
        File.Close();
    }
    CATCH(CFileException, pEx)
    {
        // Fehler ... Exception lesen
        if(pEx->m_cause == CFileException::fileNotFound)
        {
            // File wurde nicht gefunden.
        }
    }
    END_CATCH
    

    Grüssli


  • Mod

    UserMarcus schrieb:

    Hab nochmal nachgedacht,
    was ist wenn ich es so mache bleibt dann ein HANDLE zurück ?

    Jo! Und damit entsteht ein Speicherleck im OS!


  • Mod

    Dravere schrieb:

    Ich dachte wir sind hier im MFC Forum ^^

    Aber dann doch bitte CFile::GetStatus verwenden!

    ... aber selbst wenn dies ein MFC Forum ist, wäre es dumm die MFC zu vergenusswurzeln wenn es einfachere Lösungen gibt.


  • Administrator

    Martin Richter schrieb:

    Dravere schrieb:

    Ich dachte wir sind hier im MFC Forum ^^

    Aber dann doch bitte CFile::GetStatus verwenden!

    ... aber selbst wenn dies ein MFC Forum ist, wäre es dumm die MFC zu vergenusswurzeln wenn es einfachere Lösungen gibt.

    Nicht unbedingt. Für die Überprüfung ob eine Datei anwesend ist, womöglich. Aber er hat ja gesagt, dass er die Dateien lesen will und gerne überprüfen möchte, ob die Dateien vorhanden sind. Beim öffnen und arbeiten mit einer Datei kann aber mehr schief gehen, als das sie nur nicht vorhanden ist. Mein Code oben kann man gleich weiterverwenden für die anderen Fehler, welche entstehen können. Deswegen denke ich, ist der Code sinnvoller und genau das ist ja auch eben oft einer der Vorteile der MFC.

    Grüssli



  • Martin Richter schrieb:

    UserMarcus schrieb:

    Hab nochmal nachgedacht,
    was ist wenn ich es so mache bleibt dann ein HANDLE zurück ?

    Jo! Und damit entsteht ein Speicherleck im OS!

    dem OS tut's keinen beinbruch. es ist eine kleine unstimmigkeit in einem unbedeutenden userland prozess und wenn dieser prozess beendet wird (wie auch immmer) dann ist das speicherleck auch wieder wech 🙂


Anmelden zum Antworten