verificar script saber permisos fichero existencia existe escritura directorio comprobar archivo c windows winapi

script - ¿Cómo verifica si existe un directorio en Windows en C?



verificar existencia de archivo en shell (4)

Pregunta

En una aplicación de Windows C, quiero validar un parámetro pasado a una función para garantizar que exista la ruta especificada. *

¿Cómo verifica si existe un directorio en Windows en C?

* Entiendo que puedes entrar en condiciones de carrera donde, entre el momento en que compruebes la existencia y el momento en que utilizas el camino, ya no existe, pero puedo enfrentarme a eso.

Antecedentes adicionales

Saber explícitamente que un directorio existe o no puede ser complicado cuando los permisos entran en juego. Es posible que al intentar determinar si el directorio exista, el proceso no tenga permisos para acceder al directorio o a un directorio principal. Esto está bien para mis necesidades . Si el directorio no existe O no puedo acceder a él, ambos se tratan como una falla de ruta no válida en mi aplicación, por lo que no es necesario que los diferencie. Puntos de bonificación (virtuales) si su solución proporciona esta distinción.

Cualquier solución en el lenguaje C, la biblioteca C runtime o la API Win32 está bien, pero idealmente me gustaría atenerme a las bibliotecas que comúnmente se cargan (por ejemplo kernel32, user32, etc.) y evitar soluciones que impliquen cargar bibliotecas no estándar (como PathFileExists en Shlwapi.dll). Nuevamente, puntos de bonificación (virtuales) si su solución es multiplataforma.

Relacionado

¿Cómo podemos verificar si un archivo existe o no con el programa Win32?


Aquí hay una solución totalmente independiente de la plataforma (usando la biblioteca C estándar)

Editar: para que esto se compile en Linux, reemplace <io.h> con <unistd.h> y _access con access . Para una solución agnóstica de plataforma real, use la biblioteca Boost FileSystem.

#include <io.h> // For access(). #include <sys/types.h> // For stat(). #include <sys/stat.h> // For stat(). bool DirectoryExists( const char* absolutePath ){ if( _access( absolutePath, 0 ) == 0 ){ struct stat status; stat( absolutePath, &status ); return (status.st_mode & S_IFDIR) != 0; } return false; }

Una implementación específica de Windows que admite compilaciones de MBCS y UNICODE:

#include <io.h> #include <sys/types.h> #include <sys/stat.h> #include <tchar.h> BOOL directory_exists( LPCTSTR absolutePath ) { if( _taccess_s( absolutePath, 0 ) == 0 ) { struct _stat status; _tstat( absolutePath, &status ); return (status.st_mode & S_IFDIR) != 0; } return FALSE; }


Haz algo como esto:

BOOL DirectoryExists(LPCTSTR szPath) { DWORD dwAttrib = GetFileAttributes(szPath); return (dwAttrib != INVALID_FILE_ATTRIBUTES && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)); }

El método GetFileAttributes () se incluye en Kernel32.dll.


Otra opción es la función de shell PathFileExists ()

Documentación de PathFileExists ()

Esta función "Determina si una ruta a un objeto del sistema de archivos como un archivo o directorio es válida".