Domanda

Ho un fstream my_file ( "test.txt"), ma non so se esiste test.txt. Nel caso in cui esiste, vorrei sapere se posso leggerlo, troppo. Come farlo?

io uso Linux.

È stato utile?

Soluzione

Io probabilmente andare con:

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

good controlli metodo se il flusso è pronto per essere letto da.

Altri suggerimenti

È possibile utilizzare Boost.Filesystem . Ha una funzione boost::filesystem::exist.

Non so come circa il controllo dei diritti di accesso di lettura. Si potrebbe guardare a Boost.Filesystem troppo. Tuttavia probabilmente non ci sarà altro modo (portatile) di provare a leggere effettivamente il file.

Che sistema operativo / piattaforma?

Su Linux / Unix / MacOSX, è possibile utilizzare fstat .

In Windows, è possibile utilizzare GetFileAttributes .

Di solito, non c'è modo di fare questo portatile con lo standard C / C ++ funzioni IO.

se siete su unix allora accesso () può dire se è leggibile. Tuttavia, se di ACL sono in uso, allora diventa più complicato, in questo caso è meglio aprire solo il file con ifstream e provare a leggere .. se non riesci a leggere, allora la LCA può vietare la lettura.

Poiché C ++ 11 è possibile utilizzare implicito bool invece di good():

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

So che il manifesto alla fine ha detto che stavano utilizzando Linux, ma io sono un po 'sorpreso che nessuno ha menzionato il PathFileExists() chiamata API per Windows.

Sarà necessario includere la libreria Shlwapi.lib, e file di intestazione Shlwapi.h.

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

la funzione restituisce un valore BOOL e può essere chiamato in questo modo:

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

C ++ 17, cross-platform: Verificare l'esistenza di file con std::filesystem::exists e la leggibilità con std::filesystem::status & 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.";
        }
    }
}

Si consideri inoltre il controllo per il tipo di file .

Per quanto riguarda l'uso di fstat in finestre, non sono sicuro se è quello che vuoi. Da href="http://msdn.microsoft.com/en-us/library/aa246905%28v=vs.60%29.aspx" Microsoft il file deve essere già Aperto. Stat dovrebbe funzionare per voi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top