Pregunta

Tengo un mi_archivo fstream ( "test.txt"), pero no sé si existe test.txt. En caso de que exista, me gustaría saber si puedo leerlo, también. ¿Cómo hacer eso?

Yo uso Linux.

¿Fue útil?

Solución

Probablemente iría con:

ifstream my_file("test.txt");
if (my_file.good())
{
  // read away
}

Los good método comprueba si la corriente está listo para ser leído de.

Otros consejos

Es posible usar Boost.Filesystem . Tiene una función boost::filesystem::exist.

No sé cómo sobre la comprobación de los derechos de acceso de lectura. Se podría buscar en Boost.Filesystem también. Sin embargo es probable que no habrá otra manera (portátil) de tratar de leer realmente el archivo.

¿Qué sistema operativo / plataforma?

En Linux / Unix / MacOSX, se puede utilizar fstat .

En Windows, puede utilizar GetFileAttributes .

Por lo general, no hay manera de hacer esto portátil con funciones estándar de C / C ++ IO.

Si está en Unix entonces acceso () le puede decir si es legible. Sin embargo, si de ACL están en uso, entonces se vuelve más complicado, en este caso, lo mejor es simplemente abrir el archivo con ifstream y tratar de leer .. si no se puede leer a continuación, la ACL puede prohibir la lectura.

Desde C ++ 11 es posible usar implícita operador bool en lugar de good():

ifstream my_file("test.txt");
if (my_file) {
  // read away
}

Sé el cartel finalmente dijo que estaban usando Linux, pero estoy un poco sorprendido de que nadie mencionó la PathFileExists() llamada a la API para Windows.

Se tendrá que incluir la biblioteca Shlwapi.lib, y el archivo de cabecera Shlwapi.h.

#pragma comment(lib, "shlwapi.lib")
#include <shlwapi.h>

la función devuelve un valor BOOL y se puede llamar así:

if( PathFileExists("C:\\path\\to\\your\\file.ext") )
{
    // do something
}

C ++ 17, multiplataforma: Comprobar la existencia de archivos con std::filesystem::exists y legibilidad con std::filesystem::status y std::filesystem::perms :

#include <iostream>
#include <filesystem> // C++17
namespace fs = std::filesystem;

/*! \return True if owner, group and others have read permission,
            i.e. at least 0444.
*/
bool IsReadable(const fs::path& p)
{
    std::error_code ec; // For noexcept overload usage.
    auto perms = fs::status(p, ec).permissions();
    if ((perms & fs::perms::owner_read) != fs::perms::none &&
        (perms & fs::perms::group_read) != fs::perms::none &&
        (perms & fs::perms::others_read) != fs::perms::none
        )
    {
        return true;
    }
    return false;
}

int main()
{
    fs::path filePath("path/to/test.txt");
    std::error_code ec; // For noexcept overload usage.
    if (fs::exists(filePath, ec) && !ec)
    {
        if (IsReadable(filePath))
        {
            std::cout << filePath << " exists and is readable.";
        }
    }
}

Tenga en cuenta también la comprobación de la tipo de archivo .

En cuanto a la utilización de fstat en ventanas, no estoy seguro si es lo que desea. De Microsoft el archivo debe estar ya abierto. Stat debe trabajar para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top