¿Cómo puedo verificar si existe un directorio en Linux en C?¿Cómo puedo verificar si existe un directorio?
Respuesta
Puede utilizar opendir()
y comprobar si ENOENT == errno
en caso de fallo:
DIR* dir = opendir("mydir");
if (dir)
{
/* Directory exists. */
closedir(dir);
}
else if (ENOENT == errno)
{
/* Directory does not exist. */
}
else
{
/* opendir() failed for some other reason. */
}
Probablemente la mejor forma de hacerlo sea intentar abrirlo, usando solo opendir()
por ejemplo.
Tenga en cuenta que siempre es mejor intentar utilizar un recurso del sistema de archivos, y manejar cualquier error que ocurra porque no existe, en lugar de simplemente verificar y luego intentarlo. Hay una condición de carrera obvia en este último enfoque.
Es posible utilizar stat()
y pasarlo la dirección de un struct stat
, a continuación, comprobar su miembro st_mode
por tener S_IFDIR
conjunto.
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
...
char d[] = "mydir";
struct stat s = {0};
if (!stat(d, &s))
printf("'%s' is %sa directory.\n", d, (s.st_mode & S_IFDIR) : "" ? "not ");
// (s.st_mode & S_IFDIR) can be replaced with S_ISDIR(s.st_mode)
else
perror("stat()");
Otras dos formas, quizás menos correctas, es utilizarlas. La primera de ellas, utilizando sólo las bibliotecas estándar y sólo para los archivos:
FILE *f;
f = fopen("file", "r")
if(!f)
printf("there is no file there");
Esto se podría trabajar en todo el sistema operativo.
u otro también para dirs, utilizando la llamada al sistema system(). Es la peor opción, pero te da otra forma. Para alguien tal vez sea útil.
La pregunta era específicamente sobre directorios, no archivos. Y va a recomendar llamar 'system()', debe especificar qué argumento pasarle. –
"*' printf ("no hay archivo allí") '*": No poder abrir como archivo no significa necesariamente que no existe. Por esto, es posible que el código no pueda 'fopen()' un archivo existente, por ejemplo, debido a problemas de acceso a la derecha. – alk
Según man(2)stat puede utilizar la macro S_ISDIR en el campo st_mode:
bool isdir = S_ISDIR(st.st_mode);
Nota al margen, yo recomendaría usar Boost y/o Qt4 para hacer soporte multiplataforma más fácil si su software puede ser viable en otros sistemas operativos.
Utilice el siguiente código para verificar si existe una carpeta. Funciona en ambas plataformas Windows & Linux.
#include <stdio.h>
#include <sys/stat.h>
int main(int argc, char* argv[])
{
const char* folderr;
//folderr = "C:\\Users\\SaMaN\\Desktop\\Ppln";
folderr = "/tmp";
struct stat sb;
if (stat(folderr, &sb) == 0 && S_ISDIR(sb.st_mode))
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
¿Estás seguro de que los encabezados incluidos son suficientes, al menos para Linux? – alk
También se puede utilizar en combinación con access
opendir
para determinar si existe el directorio, y si existe el nombre, pero no es un directorio. Por ejemplo:
/* test that dir exists (1 success, -1 does not exist, -2 not dir) */
int
xis_dir (char *d)
{
DIR *dirptr;
if (access (d, F_OK) != -1) {
// file exists
if ((dirptr = opendir (d)) != NULL) {
closedir (dirptr);
} else {
return -2; /* d exists, but not dir */
}
} else {
return -1; /* d does not exist */
}
return 1;
}
Estoy de acuerdo que la siguiente cabecera son una de las mejores soluciones:
#include <stdio.h>
#include <sys/stat.h>
¿No necesitará algún código de acompañamiento con los encabezados para responder realmente la pregunta? –
Esto no proporciona una respuesta a la pregunta. – alk
- 1. ¿cómo puedo verificar si existe un archivo?
- 2. Cómo verificar si existe un directorio determinado en Ruby
- 3. ¿Cómo puedo verificar si existe un procedimiento en un paquete?
- 4. C manera más rápida de verificar si existe un directorio
- 5. ¿Cómo puedo verificar si existe un directorio a través de PHP?
- 6. ¿Cómo puedo verificar si existe un buffer actual en Emacs?
- 7. ¿Cómo puedo verificar si existe o no un recurso incrustado?
- 8. ¿Cómo puedo verificar si un atributo existe en XmlAttributeCollection?
- 9. java: ArrayList: ¿cómo puedo verificar si existe un índice?
- 10. ¿Cómo puedo verificar si existe un archivo usando Emacs Lisp?
- 11. ¿Cómo puedo verificar si existe un nombre de usuario dado?
- 12. ¿Cómo puedo verificar si existe un archivo en Perl?
- 13. ¿Cómo verificar si existe un cierto ensamblaje?
- 14. ¿Cómo verificar si existe un procedimiento almacenado?
- 15. ¿Cómo verificar si existe un usuario postgres?
- 16. ¿Puedo verificar si existe un archivo en una URL?
- 17. ¿Puedo verificar si existe un archivo en una URL?
- 18. C# ¿Cómo puedo verificar si existe una URL/es válida?
- 19. ¿Cómo puedo verificar si existe una cadena en una matriz?
- 20. Cómo verificar si un archivo existe en un directorio en la tarjeta SD
- 21. Cómo verificar si existe un directorio/archivo/enlace simbólico con un comando en Ruby
- 22. ¿Cómo puedo verificar si el archivo existe en Makefile?
- 23. ¿Cómo puedo verificar si existe una variable en Scheme?
- 24. ¿Cómo puedo verificar si existe una cadena en otra cadena?
- 25. Cómo verificar si existe un archivo específico en el directorio o cualquiera de sus subdirectorios
- 26. ¿Cómo debo verificar si existe Gravatar?
- 27. ¿Cómo puedo averiguar si un archivo es un archivo o directorio si no existe?
- 28. Compruebe si existe un directorio en PHP
- 29. EXTJS - ¿Cómo verificar si el elemento existe?
- 30. ¿Cómo verificar si existe una propiedad?
duplicado posible de [C manera más rápida para comprobar si existe un directorio] (http: // stackoverflow. com/questions/9314586/c-faster-way-to-check-if-a-directory-exists) –