Cum obții o listă de directoare în C?

Cum scanați un director pentru dosare și fișiere în C? Trebuie să fie cross-platformă.

0
fr hi bn

9 răspunsuri

Nu există niciun mod C (sau C ++) standard pentru a enumera fișiere într-un director.

În Windows, puteți utiliza funcțiile FindFirstFile/FindNextFile pentru a enumera toate intrările dintr-un director. Sub Linux/OSX utilizați funcțiile opendir/readdir/closedir.

0
adăugat
@ceretullis: Notați cuvântul "standard" .. Boost nu este standard încă ..
adăugat autor krebstar, sursa
Boost nu este, de asemenea, C.
adăugat autor Chris Lutz, sursa
Boost :: sistem de fișiere ??
adăugat autor paxos1977, sursa

Răspunsul strict este "nu poți", așa cum însăși conceptul de dosar nu este cu adevărat cross-platformă.

Pe platformele MS puteți utiliza funcțiile _findfirst, _findnext și _findclose pentru un fel de simț "c" și FindFirstFile și FindNextFile pentru apelurile Win32 care stau la baza.

Iată răspunsul C-FAQ:

http://c-faq.com/osdep/readdir.html

0
adăugat
există un alias deja setat pentru _findfirst, _findnext și _findclose undeva? nu în Windows.h dreapta?
adăugat autor BuddyJoe, sursa

Afișarea directorilor variază foarte mult în funcție de OS/platforma în cauză. Acest lucru se datorează faptului că diferite sisteme de operare care utilizează propriul sistem intern solicită acest lucru.

O soluție la această problemă ar fi să căutați o bibliotecă care să ascundă această problemă și să fie portabilă. Din păcate, nu există o soluție care să funcționeze fără probleme pe toate platformele.

Pe sistemele POSIX compatibile, puteți utiliza biblioteca pentru a realiza acest lucru folosind codul postat de Clayton (care este referit inițial la Programarea avansată sub UNIX carte de W. Richard Stevens). această soluție va funcționa în conformitate cu sistemele * NIX și ar funcționa și pe Windows dacă aveți instalat Cygwin.

Alternativ, ați putea scrie un cod pentru a detecta sistemul de operare subiacent și apoi apelați funcția de listă corespunzătoare a directorului care ar păstra modul corect de listă a structurii de directoare în acel OS.

0
adăugat

Metoda cea mai similară la readdir folosește, probabil, puțin cunoscute _find familie de funcții .

0
adăugat

GLib is a portability/utility library for C which forms the basis of the GTK+ graphical toolkit. It can be used as a standalone library.

Conține ambalaje portabile pentru gestionarea directoarelor. Pentru detalii, consultați documentația Glib File Utilities .

În mod personal, nici măcar nu m-aș gândi să scriu cantități mari de cod C fără ceva ca GLib în spatele meu. Portabilitatea este un lucru, dar este, de asemenea, frumos să obțineți gratuit structuri de date, ajutoare de fir, evenimente, mainloops etc.

Jikes, aproape ca incep sa suna ca un tip de vanzari :) (nu-ti face griji, glib este open source (LGPL) si nu sunt afiliat cu ea in nici un fel)

0
adăugat
+1; Funcția relevantă este g_dir_read_name()
adăugat autor weiqure, sursa

Am creat un antet Open Source (BSD) C care se ocupă de această problemă. În prezent, suportă POSIX și Windows. Te rog sa verifici:

https://github.com/cxong/tinydir

tinydir_dir dir;
tinydir_open(&dir, "/path/to/dir");

while (dir.has_next)
{
    tinydir_file file;
    tinydir_readfile(&dir, &file);

    printf("%s", file.name);
    if (file.is_dir)
    {
        printf("/");
    }
    printf("\n");

    tinydir_next(&dir);
}

tinydir_close(&dir);
0
adăugat
Cum ajută acest lucru mai mult decât implementările originale dependente de sistem? Sau este nevoie doar de o singură bibliotecă numită pentru Windows și POSIX?
adăugat autor kevr, sursa
"vote up" pentru tinydir.h, bine făcut.
adăugat autor M.J.Ahmadi, sursa

opendir/readdir are POSIX. If POSIX is not enough for the portability you want to achieve, check Apache Portable Runtime

0
adăugat

Următoarele vor tipări numele fișierelor în directorul curent:

#include 
#include 
#include 

int main (void)
{
  DIR *dp;
  struct dirent *ep;     
  dp = opendir ("./");

  if (dp != NULL)
  {
    while (ep = readdir (dp))
      puts (ep->d_name);

    (void) closedir (dp);
  }
  else
    perror ("Couldn't open the directory");

  return 0;
}

(credit: http://www.gnu.org/ software/libtool/manual/libc/Simple-Directory-Lister.html )

0
adăugat
Ce zici de aceasta: eroare : nume de tip necunoscut "off64_t"
adăugat autor Tomáš Zato, sursa
Pentru Windows, este posibil să aveți nevoie de implementarea win32 a dirent.h: github.com/tronkko/dirent . Doar schimbați la "dirent.h"
adăugat autor bot1131357, sursa
@Clayton dar am fost învățat că niciodată nu pune puts (), deoarece nu știe câte caractere pentru a imprima?
adăugat autor YakRangi, sursa
A trebuit să schimb codul în timp ce a fost (ep = readdir (dp))! = NULL)
adăugat autor gwg, sursa
Acest lucru ar trebui să funcționeze și pe Windows, cel puțin cu MinGW.
adăugat autor el.pescado, sursa
@Rouftantical Cred că ai capul despre devine și nu pune. devine este periculoasă deoarece poate provoca o depășire a buffer-ului în timp ce puts nu poate.
adăugat autor molnarg, sursa
@Clayton - Ce se întâmplă dacă vreau să tipăresc doar fișierele .txt?
adăugat autor jimo, sursa

You can find the sample code on the wikibooks link

/**************************************************************
 * A simpler and shorter implementation of ls(1)
 * ls(1) is very similar to the DIR command on DOS and Windows.
 **************************************************************/
#include 
#include 

int listdir(const char *path) 
{
  struct dirent *entry;
  DIR *dp;

  dp = opendir(path);
  if (dp == NULL) 
  {
    perror("opendir");
    return -1;
  }

  while((entry = readdir(dp)))
    puts(entry->d_name);

  closedir(dp);
  return 0;
}

int main(int argc, char **argv) {
  int counter = 1;

  if (argc == 1)
    listdir(".");

  while (++counter <= argc) {
    printf("\nListing %s...\n", argv[counter-1]);
    listdir(argv[counter-1]);
  }

  return 0;
}
0
adăugat