C/Visual C - problemas con ficheros/directorios

 
Vista:

problemas con ficheros/directorios

Publicado por quantium (22 intervenciones) el 21/10/2002 23:27:43
Buenas.
He creado un programa el cual copia el contenido de muchos ficheros de texto en uno solo, por ejemplo:

./programa 1.txt 2.txt 3.txt todos.txt

En este ejemplo se copia 1.txt 2.txt en todos.txt. Pues bien, el problema surge cuando el usuario en vez de poner un archivo de texto pone el nombre de un directorio, ejemplo:

./programa directorio contenido.txt

Pues bien, el programa lo que hace es crear el archivo contenido.txt pero vacio. A mi lo que me gustaria saber es si existe alguna funcion tipo isdigit() para directorios, seria algo como isdirectory() ;)

Venga un saludo a todos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Verificación de directorios en C++

Publicado por Alejandro (913 intervenciones) el 27/03/2025 19:20:33
Para determinar si una ruta corresponde a un directorio en C++, puedes utilizar funciones de la API de Windows o de la biblioteca estándar de C++ (C++17 y posteriores). A continuación, te muestro cómo hacerlo utilizando ambas opciones.

1. Usando la API de Windows



Si estás trabajando en un entorno Windows, puedes utilizar la función `GetFileAttributes` para verificar si una ruta es un directorio. Aquí tienes un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <windows.h>
#include <iostream>
 
bool isDirectory(const std::string& path) {
    DWORD attributes = GetFileAttributes(path.c_str());
    return (attributes != INVALID_FILE_ATTRIBUTES && (attributes & FILE_ATTRIBUTE_DIRECTORY));
}
 
int main(int argc, char* argv[]) {
    if (argc < 3) {
        std::cerr << "Uso: " << argv[0] << " <archivo1> <archivo2> ... <destino>" << std::endl;
        return 1;
    }
 
    std::string lastArg = argv[argc - 1];
    if (isDirectory(lastArg)) {
        std::cerr << "El último argumento es un directorio, no se puede crear el archivo." << std::endl;
        return 1;
    }
 
    // Aquí iría la lógica para copiar los archivos
    std::cout << "Copiando archivos..." << std::endl;
 
    return 0;
}

2. Usando C++17 y `<filesystem>`



Si estás utilizando C++17 o posterior, puedes aprovechar la biblioteca `<filesystem>`, que proporciona una forma más sencilla y portátil de trabajar con archivos y directorios. Aquí tienes un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <filesystem>
 
namespace fs = std::filesystem;
 
int main(int argc, char* argv[]) {
    if (argc < 3) {
        std::cerr << "Uso: " << argv[0] << " <archivo1> <archivo2> ... <destino>" << std::endl;
        return 1;
    }
 
    fs::path lastArg = argv[argc - 1];
    if (fs::is_directory(lastArg)) {
        std::cerr << "El último argumento es un directorio, no se puede crear el archivo." << std::endl;
        return 1;
    }
 
    // Aquí iría la lógica para copiar los archivos
    std::cout << "Copiando archivos..." << std::endl;
 
    return 0;
}

3. Descripción del código


- API de Windows: La función `GetFileAttributes` se utiliza para obtener los atributos del archivo o directorio. Si el atributo `FILE_ATTRIBUTE_DIRECTORY` está presente, significa que la ruta corresponde a un directorio.
- C++17 y `<filesystem>`: La función `fs::is_directory` verifica si la ruta corresponde a un directorio de manera más sencilla y legible.

4. Manejo de errores


Asegúrate de manejar adecuadamente los errores, como la falta de permisos para acceder a la ruta o la inexistencia de la misma.

Conclusión


Puedes utilizar la API de Windows o la biblioteca `<filesystem>` de C++17 para verificar si una ruta corresponde a un directorio. Esto te permitirá evitar la creación de archivos vacíos cuando el usuario proporciona un directorio como argumento. ¡Buena suerte, Quantium!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar