HILFE!Fehlermeldung beim Dateneinlesen



  • Hallo Leute,

    ich habe ein Problem, was das Einlesen von Zeilen einer Textdatei betrifft. Wenn ich folgenden Code verwende kann ich die erste Zeile der Textdatei auslesen und bearbeiten(bei mir handelt es sich úm einen Pfad, wobei ein selbstdefinierter Ordner gelöscht wird).

    void CEraserDlg::OnDeleteFiles() 
    {
        UpdateData(TRUE);
        CStdioFile File;
        CString string;
    
        if(m_bWin9x == TRUE && m_bWinNT==FALSE)
        {
            //Pfade aus Datei Path.txt auslesen.
    
       File.Open("Path.txt", CFile::modeRead,NULL);
       File.ReadString(string);
    
       DelTree(string);
       UpdateData(TRUE);
       }
    }//Funktioniert wunderbar
    

    Nun ist es aber so, dass die Datei mehrere Pfadangaben enthalten kann, wobei jeder Pfad abgearbeitet werden soll(nicht nur die erste Zeile...ich packe das ganze in eine schleife, die dann so auf sieht., wobei das Programm dann nicht die Zeilen der Datei auswertet und abarbeitet, sondern abstürzt Mit diversen Meldungen(Debug Assertion Failed...Programm c:\blabla...FILE: fgets.c...LINE:60...Expression: str!=NULL)

    WAS ist hier falsch...? 😕

    void CEraserDlg::OnDeleteFiles() 
    {
        UpdateData(TRUE);
        CStdioFile File;
        CString string;
    
        if(m_bWin9x == TRUE && m_bWinNT==FALSE)
        {
            //Pfade aus Datei Path.txt auslesen.
           while(File.ReadString(string))
           {
           File.Open("Path.txt", CFile::modeRead,NULL);
           File.ReadString(string);
    
           DelTree(string);
           UpdateData(TRUE);
           }//while
       }//if
    }//OnDeleteFiles
    

    Zusatzfrage:

    Ich habe hier aus dem Forum folgenden Code:

    bool DelTree(const CString& Path)
    {
        CFileFind ff;
        bool err = false;
    
        BOOL cont = ff.FindFile(Path + "\\*");
        while(cont)
        {
            cont = ff.FindNextFile();
            if(ff.IsDots())
                continue;
            if(ff.IsDirectory())
                err |= !DelTree(ff.GetFilePath());
            else
            {
                CString file(ff.GetFilePath());
                SetFileAttributes(file,FILE_ATTRIBUTE_NORMAL);
                err |= !DeleteFile(ff.GetFilePath());
            }
        }
        ff.Close();
    
        SetFileAttributes(Path,FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_DIRECTORY);
        err |= !RemoveDirectory(Path);
    
        return !err;
    }
    

    Mit dem Aufruf

    DelTree(C:\\OrdnerTest\\Ordner2Test");
    

    wird der ganze Ordner "OrdnerTest" mit Ihnalt gelöscht...was muss ich verändern, damit nur der Inhalt und nicht auch der Ordner (hier OrdnerTest) gelöscht wird??

    Vielen Dank für eure Hilfe im Voraus

    Gruss dbase



  • Hallo,

    ähm........
    <zitat>

    //Pfade aus Datei Path.txt auslesen.
    while(File.ReadString(string))
    {
    File.Open("Path.txt", CFile::modeRead,NULL);
    File.ReadString(string);
    

    </zitat>

    Hinweis:
    Dein FileReadString ist an der falschen STelle.

    File.Open("Path.txt", CFile::modeRead,NULL);
    while(File.ReadString(string))
    {
      //Deine Löschmethode
    }
    File.Close();
    

    Was Du da machst sieht so unlogisch aus das dies nur abknallen kann. (LEseschleife einer Datei die dann sich selbst wieder öffnet etc.)

    Zur zweiten Frage:
    Einfach:

    SetFileAttributes(Path,FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_DIRECTORY);
    err |= !RemoveDirectory(Path);
    

    Entfernen.

    Gruß

    Ocrana



  • Hallo Orcana,

    ersteinmal vielen Dank...ist sehr nett und genial, um die Zeit noch eine Antwort zu bekommen...habe inzwischen ein wenig experimentiert...aber ein wenig zuviel...habe mir den halben Inhalt meines Desktops gelöscht:-)

    Aber dank deiner Antworten funktioniert es jetzt perfekt...wenn du mir noch sagen kannst, wie es möglich ist, dass nur der letzte Ordner nicht gelöscht wird...also der Ordner, von dem aus gelöscht wird stehen bleibt, wäre ich happy...(momentan ist es so, dass zwar die inhalte der einzelnen ordner des zu löschenden Ordnerinhaltes gelöscht werden, aber die Ordner stehen bleiben, die sich in dem Ursprungsordner befinden...ich hoffe es war jetzt nciht allzu verwirrend...im klartext...es soll nur der Ordner übrigbleiben, der als "root" ausgelesen wurde...:-)

    Gruss dbase



  • Hallo,

    noprob dafür sind Foren ja da 😉

    Ok, für Deine Ordner:

    VErsuche mal unter:

    err |= !DelTree(ff.GetFilePath());

    noch:
    err |= !RemoveDirectory(ff.GetFilePath());

    Es kann sein das es hier zu einem Konflikt kommt. Wenn das nicht funktioniert dann sag kurz BEscheid und ich poste einen COde der garantiert arbeitet.

    GRuß

    Ocrana



  • Hallo Ocrana,

    nochmals vielen dank...das mit den ordnern löschen funktioniert jetzt perfect...aber wie es nun mal so ist, kommt auch schon ein weiteres problem... 😃
    In meinem Programm ist es nun so, dass bei Programmstart (über Exedatei starten) eine Textdatei in dem Ordner angelegt wird...sieht folgendermaßen aus

    CDialog::OnInitDialog();
    CStdioFile file;
    CString filename,txt;
    filename="UsrPath.txt";
    file.Open(filename, CFile::modeCreate);
    

    Mit nem Installshield-Programm lasse ich nun eine Setupdatei erstellen, wobei es dann bei der Installation per Auswahl möglich ist sich einen Eintrag im Startmenü und eine Verknüpfung auf den Desktop anzulegen. Bis hierhin ist alles Okay...aber wenn dann das Programm über den Desktop (Verknüpfung) aufgerufen wird, wird die datei UsrPath.txt auf dem Desktop erstellt und nicht in dem Ordner, wo sich die eigentliche Exedatei befindet (Beim Aufruf über das Startmenü wird dann gar keine Datei angelegt). Da noch weitere Dateien zur Ausführung des Programms benötigt werden, die sich aber in dem Installationsordner befinden kommt es nun zum Absturz des Programms...wie kann ich denn die Datei UsrPath.txt explizit im Installationsordner erzeugen lassen...und das, auch bei einem Aufruf über die Verknüpfung...Wäre super, wenn es da ne Möglichkeit gibt...

    Nice Advent
    Gruss dbase


Anmelden zum Antworten