Avatar billede themepark Nybegynder
12. september 2005 - 04:24 Der er 10 kommentarer og
1 løsning

Gennemløb filer i mappe

Tja, jeg er i gang med at programmere i C, og skulle gerne på en eller anden måde kunne gennemløbe nogle filer og få deres filnavne. Men jeg er ikke særligt godt bekendt med C, så jeg aner ikke hvordan det kan lade sig gøre.

Jeg har alle de filer jeg skal søge igennem i en bestemt mappe, som ingen undermapper har. Og jeg skal helst kunne angive stien til den mappe i forhold til den mappe, hvor mit program ligger...jeg kan typisk nok ikke huske det fine ord for det :S

Yderligere ved jeg ikke om jeg skal have det lavet i Windows eller DOS, så hvis det er muligt at lave noget, der ikke bruger Windows funktioner, ville det være rart.

Er der nogle der vil være så venlige at hjælpe mig med dette? :)
Avatar billede arne_v Ekspert
12. september 2005 - 07:43 #1
hvis din compiler/platform har readdir så:

#include <stdio.h>
#include <stdlib.h>

#include <dirent.h>
#include <sys/stat.h>

#define DIRSEP "\\"
#define TESTDIR "C:\\mingw"

void process(char *path)
{
  DIR *dirp;
  struct dirent *entp;
  struct stat stbuf;
  char fnm[256];
  dirp = opendir(path);
  while((entp = readdir(dirp)) != NULL)
  {
      if(entp->d_name[0]!='.')
      {
          sprintf(fnm,"%s%s%s",path,DIRSEP,entp->d_name);
          stat(fnm,&stbuf);
          if(!S_ISDIR(stbuf.st_mode))
          {
              printf("%s %d\n",fnm,stbuf.st_size);
          } else {
              process(fnm);
          }
      }
  }
  closedir(dirp);
  return;
}

int main()
{
  process(TESTDIR);
  return 0;
}
Avatar billede arne_v Ekspert
12. september 2005 - 07:44 #2
og et Win32 API eksempel:

#include <stdio.h>

#include <windows.h>

int main()
{
  WIN32_FIND_DATA data;
  HANDLE h = FindFirstFile("*.c",&data);
  if(h!=INVALID_HANDLE_VALUE) {
    printf("%s %d %d\n",data.cFileName,data.nFileSizeHigh,data.nFileSizeLow);
    while(FindNextFile(h,&data)) {
        printf("%s %d %d\n",data.cFileName,data.nFileSizeHigh,data.nFileSizeLow);
    }
  }
  FindClose(h);
  return 0;
}
Avatar billede themepark Nybegynder
13. september 2005 - 13:49 #3
De fungerer jo ganske fremragende, begge 2 :)

Og jeg er med på det hvad det meste af koden gør. Men kan du forklare mig hvad sprintf og stat gør?
Avatar billede themepark Nybegynder
13. september 2005 - 13:51 #4
Hov ja, en anden ting. Er det muligt at fjerne eller undgå at få efternavnene (.???) med?
Avatar billede arne_v Ekspert
13. september 2005 - 14:57 #5
stat finder bl.a. størrelsen (det er det som eksemplerne gør - du skal sikkert
ikke bruge den)

sprintf bruges til at konkatanere dele af et filnavn
Avatar billede arne_v Ekspert
13. september 2005 - 14:57 #6
du kan sagtens søge baglæns efter punktum hvis du vil det
Avatar billede themepark Nybegynder
13. september 2005 - 18:31 #7
Aha :) Ja jeg har siddet og rodet lidt med det og fået skåret det væk som jeg ikke skal bruge :D

Men jeg har lige 2 sidste spørgsmål, hvis du vil fortælle mig dette. Hvordan gør jeg så det med at søge baglæns efter punktum? Jeg er overhovedet ikke bekendt med C endnu.

Og bare for at være sikker, da jeg testede det, så det ud til at filerne automatisk bliver alfabetisk sorteret. Men er det rigtigt nok eller har jeg bare været heldig?
Avatar billede arne_v Ekspert
13. september 2005 - 18:59 #8
lidt læsning siger:

Find* - sorteret på NTFS / tilfældig på FAT32

readdir - ingen garanti
Avatar billede arne_v Ekspert
13. september 2005 - 19:00 #9
for(i=strlen(s)-1;i>=0;i--)
{
  if(s[i]=='.')
  {
      s[i] = '\0';
      break;
  }
}

måske
Avatar billede arne_v Ekspert
13. september 2005 - 19:01 #10
og et svar
Avatar billede themepark Nybegynder
13. september 2005 - 20:21 #11
lol...nå, det var det du mente, jeg troede du snakkede om en mid funktion eller lignende :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester