DOS Dir Befehl in C nachbilden



  • Hallo,
    ich will den DOS Dir Befehl in C nachbilden, und das sortiert nach der letzten Datei/DIR Änderung komme aber nicht weiter, versuche über eine Liste die Einträge zu ordnen, jedoch habe ich wohl etwas übersehen, am Ende steht nur der letzte Eintrag mehrmals in der Liste (werden da nur flache Kopien gemacht???)! Habe den Code mehrmals durchgesehen, finde den Fehler einfach nicht 😡
    Wäre nett, wenn mir jemand auf die Sprünge helfen könnte. Hier der komplette Code:

    /******************************************************************************/
    /*                  liste.c                                        */
    /******************************************************************************/
    #include "liste.h"
    #include "datetime.h"
    
    struct Liste *current;
    
    void Ausgabe(_finddata_t *entrylist){
        struct tm DataInfo;
        convertDate(entrylist->time_write,&DataInfo.tm_mday, &DataInfo.tm_mon,     \
        &DataInfo.tm_year);     
        convertTime(entrylist->time_write,&DataInfo.tm_hour, &DataInfo.tm_min);                        
        printf("%02i.%02i.%4i  %02i:%02i  ",DataInfo.tm_mday,                      \
        DataInfo.tm_mon,DataInfo.tm_year,DataInfo.tm_hour,DataInfo.tm_min);
        if(entrylist->attrib & _A_SUBDIR) printf("<DIR>         %s\n",             \
        entrylist->name);
        else printf("     %-9i%s\n",entrylist->size, entrylist->name);
    }
    
    int ListVgl(time_t x, time_t y){ 
        printf("%ld %ld\n",x,y);
        if(x>=y)
            return (1);
        else
            return (0);
    }
    
    void insert(struct _finddata_t *entry){
        struct Liste *dummy=(struct Liste *)malloc( sizeof(struct Liste) );
        if (dummy){
            Ausgabe(entry);
            dummy->dirEntry=entry;
            dummy->next = 0;
            if(!head){
               head = dummy;
               }
            else{
               if(ListVgl(head->dirEntry->time_write,dummy->dirEntry->time_write)){
                  dummy->next=head;
                  head=dummy;
                  }
               else{
                  current = head;
                  while(current->next && !ListVgl(current->dirEntry->time_write,\
                  dummy->dirEntry->time_write)){
                     current=current->next;
                     }
                  dummy->next=current->next;
                  current->next=dummy;
                  }
               }
    
        }
    }
    
    void initIteration(void){
        current=head;
        Ausgabe(current->dirEntry);
        struct _finddata_t *DirEntry;
        while(DirEntry=getnext())
            {
            Ausgabe(DirEntry);
            }
    
    }
    
    struct _finddata_t *getnext(void){
        if(current->next)
            {
            current=current->next;
            return(current->dirEntry);
            }
        else
            return 0;
    }
    
    void destroyList(void){
        struct Liste *dummy;
        current=head->next;
        while(current){
            dummy = current->next;
            free(current->dirEntry);
            free(current);
            current=dummy;
        }
    }
    
    /******************************************************************************/
    /*                  mydir.c                                           */
    /******************************************************************************/
    #include "datetime.h"
    #include "liste.h"
    struct Liste *head =0;
    int main(int argc, char **argv)
    {
    struct _finddata_t entry;
    int done = 0;
    long handle;
    char sSearchDir[256];
    if(argc<=1) {
        strcpy( sSearchDir, "*.*" );}
    else{
        sprintf(sSearchDir,"%s\\*.*",argv[1]);
        //strcpy( sSearchDir, argv[1] );
        //strcat( sSearchDir, "\\*.*" );
        }
    if ((handle = _findfirst(sSearchDir,&entry))!= -1L)
        {
        while(!done)
            {
            insert(&entry);
            done = _findnext(handle, &entry);
            }
        _findclose(handle);
        }
    else
    {printf("Datei nicht gefunden!");}
    
    initIteration();
    
    destroyList();
    //int leak = _CrtDumpMemoryLeaks();
    
    }
    
    /******************************************************************************/
    /*                  liste.h                                           */
    /******************************************************************************/
    #ifndef __LISTE_H
    #define __LISTE_H
    #include <io.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    struct Liste{
        struct _finddata_t *dirEntry;
        struct Liste *next;
    };
    
    static extern struct Liste *head;
    
    extern void Ausgabe(_finddata_t *entrylist);
    extern void insert(struct _finddata_t *entry);
    extern void initIteration(void);
    extern struct _finddata_t *getnext(void);
    extern void destroyList(void);
    #endif
    
    /******************************************************************************/
    /*                  datetime.c                                          */
    /******************************************************************************/
    #include "datetime.h"
    
    void convertDate(time_t time, int *day, int *month, int *year)
    {
        struct tm zeitdaten;
        zeitdaten = *localtime(&time);
        *month = zeitdaten.tm_mon + 1;
        *day = zeitdaten.tm_mday;
        *year = zeitdaten.tm_year + 1900;
    }
    
    void convertTime(time_t time, int *hour, int *min)
    {
        struct tm zeitdaten;
        zeitdaten = *localtime(&time);
        *hour = zeitdaten.tm_hour;
        *min = zeitdaten.tm_min;
    }
    
    /************************************/
    /*          datetime.h              */
    /************************************/
    #ifndef __datetime_h		
    #define __datetime_h
    #endif
    #include <time.h>
    
    extern void convertDate(time_t time, int *day, int *month, int *year);
    
    extern void convertTime(time_t time, int *hour, int *min);
    

    Edit by AJ: code-tags durch cpp-tags ersetzt. Mit Farbe lässt es sich sicher leichter lesen 😉



  • Habe gerade einen kleinen Fehler beim erneuten kompilieren gefunden, in liste.h darf natürlich nur

    extern struct Liste *head;
    

    stehen


Anmelden zum Antworten