txt - ¿Cómo se obtiene una lista de directorio en C?
manejo de directorios en c (10)
¿Cómo se escanea un directorio para carpetas y archivos en C? Tiene que ser multiplataforma.
Creé un encabezado C de código abierto (BSD) que trata este problema. Actualmente es compatible con POSIX y Windows. Por favor, míralo:
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);
Demasiado tarde, pero supongo que no puedo contenerme ...
Usando el int system(char*)
C int system(char*)
puedes hacer todo tipo de cosas a través de una interfaz C "portátil". Tendría que cargar la aplicación con el lenguaje específico del sistema (por ejemplo, Shell / Bash, DOS, PowerShell), pero al menos no necesitará vincular bibliotecas adicionales. Y, a diferencia de dirent
, puedes hacer todo tipo de cosas "independientes de la plataforma" al usarlo.
Ejemplo de listado de directorios con Linux (principalmente pseudo):
system("ls . > some_file_or_pipe_or_whatever") //
fscanf(file_or_pipe_or_whatever, "%s", a_line_from_ls);
El método más parecido para readdir
es probablemente usar la poco conocida _find
family of functions .
La lista de directorios varía mucho según el SO / plataforma en consideración. Esto se debe a que varios sistemas operativos usan sus propias llamadas internas del sistema para lograr esto.
Una solución a este problema sería buscar una biblioteca que enmascare este problema y sea portátil. Lamentablemente, no existe una solución que funcione en todas las plataformas sin problemas.
En los sistemas compatibles con POSIX, puede usar la biblioteca para lograr esto utilizando el código publicado por Clayton (al que se hace referencia originalmente de Advanced Programming en el libro de UNIX de W. Richard Stevens). esta solución funcionará en sistemas * NIX y también funcionaría en Windows si tiene instalado Cygwin.
Alternativamente, podría escribir un código para detectar el sistema operativo subyacente y luego llamar a la función apropiada de listado de directorios que contendría la forma "correcta" de enumerar la estructura de directorios bajo ese sistema operativo.
La respuesta estricta es "no se puede", ya que el concepto mismo de una carpeta no es realmente multiplataforma.
En las plataformas MS puede usar _findfirst, _findnext y _findclose para una sensación de tipo ''c'', y FindFirstFile y FindNextFile para las llamadas Win32 subyacentes.
Aquí está la respuesta C-FAQ:
Lo siguiente imprimirá los nombres de los archivos en el directorio actual:
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
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;
}
(crédito: http://www.gnu.org/software/libtool/manual/libc/Simple-Directory-Lister.html )
No existe una forma estándar C (o C ++) para enumerar archivos en un directorio.
En Windows, puede usar las funciones FindFirstFile / FindNextFile para enumerar todas las entradas en un directorio. En Linux / OSX, use las funciones opendir / readdir / closedir.
Puede encontrar el código de muestra en el enlace wikibooks
/**************************************************************
* A simpler and shorter implementation of ls(1)
* ls(1) is very similar to the DIR command on DOS and Windows.
**************************************************************/
#include <stdio.h>
#include <dirent.h>
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;
}
opendir / readdir son POSIX. Si POSIX no es suficiente para la portabilidad que desea lograr, consulte Apache Portable Runtime
GLib es una biblioteca de portabilidad / utilidad para C que forma la base del juego de herramientas gráficas GTK +. Se puede usar como una biblioteca independiente.
Contiene envoltorios portátiles para administrar directorios. Consulte la documentación de Glib File Utilities para más detalles.
Personalmente, ni siquiera consideraría escribir grandes cantidades de C-code sin algo como GLib detrás de mí. La portabilidad es una cosa, pero también es bueno obtener estructuras de datos, subprocesos, eventos, mainloops, etc. gratis
Jikes, casi estoy empezando a sonar como un vendedor :) (no te preocupes, glib es de código abierto (LGPL) y no estoy afiliado a él de ninguna manera)