2010-11-26 30 views
8

¿Cómo comprobar si el directorio ya existe en MFC (VC++)? Estoy usando el código siguiente para obtener la ruta actual de la aplicación y allí estoy creando la carpeta NDSLog para que todos mis archivos de registro estén allí, ahora quiero verificar si la carpeta NDSLog ya existe. No la cree. ¿Cómo hacer eso?¿Cómo comprobar si el directorio ya existe en MFC (VC++)?

Gracias.

char strPathName[_MAX_PATH]; 
    ::GetModuleFileName(NULL, strPathName, _MAX_PATH); 

    // The following code will allow you to get the path. 
    CString newPath(strPathName); 
    int fpos = newPath.ReverseFind('\\'); 

    if (fpos != -1) 
    newPath = newPath.Left(fpos+1);  
    newPath += "NDSLog\\" ; 

    CreateDirectory(newPath,NULL); 
+5

¿Puedo interponer un alegato para NO poner sus registros bajo el directorio actual? En Vista y Windows 7, una aplicación no elevada (ordinaria, en otras palabras) no puede escribir en ningún lugar bajo Archivos de programa. Ya que está escribiendo este código hoy y está escribiendo para Windows, use AppData (CSIDL_APPDATA) para sus registros. Crea un subdirectorio para tu aplicación y si quieres otro para los registros. –

Respuesta

22

La forma más sencilla de comprobar si existe un archivo/directorio es utilizar GetFileAttributes:

if (GetFileAttributes(newPath) == INVALID_FILE_ATTRIBUTES) { 
    CreateDirectory(newPath,NULL); 
} 

Tenga en cuenta que la función devolverá INVALID_FILE_ATTRIBUTES incluso si falla debido a alguna otra razón, como no tener permisos para acceder al archivo, por lo que debe verificar el valor de retorno de CreateDirectory para asegurarse de que haya tenido éxito.

En realidad, no necesita verificar si el directorio ya existe; CreateDirectory establecerá un código de error si el directorio ya existe:

if (!CreateDirectory(newPath,NULL)) { 
    if (GetLastError() == ERROR_ALREADY_EXISTS) { 
    // directory already exists 
    } else { 
    // creation failed due to some other reason 
    } 
} 
+1

Ambas soluciones * no * tienen en cuenta que puede haber un archivo (regular) con el mismo nombre que el directorio para crear: El primer enfoque ('GetFileAttributes()') debería agregar una marca si el atributo "directorio" se establece en caso de que el valor de retorno! = 'INVALID_FILE_ATTRIBUTES'. Entonces el directorio realmente ya existe. De lo contrario, un archivo común con el mismo nombre evitará que se cree el directorio. Lo mismo para el segundo enfoque: 'CreateDirectory()' devuelve 'ERROR_ALREADY_EXISTS' si ya existe un archivo regular (no un directorio). –

0

FindFirstFile. A pesar del "Archivo" en el nombre, encontrará directorios perfectamente bien.

1

utilizo PathFileExists.

0

Debo señalar que los archivos GetFileAttributes funcionan lentamente cuando el archivo es una ruta de red. En realidad, funciona lento por primera vez, y rápido después.

1

¿Qué tal PathIsDirectory()? En el ejemplo original, puede usar PathRemoveFilespec() seguido de PathCombine() para agregar un nuevo nombre de archivo/extensión. En el caso improbable de que su objetivo sea solo Windows 8 o posterior, hay sabores más seguros de estas funciones en PathCch...().

Cuestiones relacionadas