Sto usando C++ fstream per leggere un file di configurazione.Controlla se un fstream è un file o una directory
#include <fstream>
std::ifstream my_file(my_filename);
In questo momento, se si passa il percorso di una directory, silenziosamente ignora questo. Per esempio. my_file.good()
restituisce true, anche se my_filename
è una directory. Dato che questo è un input non voluto per il mio programma, mi piace controllarlo e lanciare un'eccezione.
Come faccio a verificare se un fstream appena aperto è un file, una directory o uno stream normale?
io non riesco a trovare un modo per entrambi:
- ottenere il descrittore di file da un dato ifstream.
- utilizzare qualche altro meccanismo per trovare queste informazioni nel ifstream.
In some forum discussion è stato suggerito che nessuno dei due è possibile perché questo è dipendente dal sistema operativo, e quindi non potrebbe mai essere parte dello standard di flickr C++.
L'unica alternativa che posso pensare è quello di riscrivere il mio codice per sbarazzarsi di ifstream del tutto e ricorrere al C-metodo di un descrittore di file (*fp
), insieme a fstat()
:
#include <stdio.h>
#include <sys/stat.h>
FILE *fp = fopen(my_filename.c_str(), "r");
// skip code to check if fp is not NULL, and if fstat() returns != -1
struct stat fileInfo;
fstat(fileno(fp), &fileInfo);
if (!S_ISREG(fileInfo.st_mode)) {
fclose(fp);
throw std::invalid_argument(std::string("Not a regular file ") + my_filename);
}
preferisco fstream. Quindi, la mia domanda.
Quale implementazione di libreria standard e su quale sistema operativo? Trovo difficile credere che qualcosa possa andare storto come descrivi. 'good()' dovrebbe restituire false se 'myfilename' è una directory. –
Sto usando OS X, 10.10, C++ 11. – MacFreek
Credo che le vecchie (o, sembra, non così vecchie) derivate da Unix permettessero di aprire le directory come file per leggere il loro contenuto, quindi mentre questo è sorprendente, non è così sorprendente. BTW: Qual è il contenuto di quella directory se lo leggi con 'fstream'? –