Come posso verificare se esiste una directory su Linux in C?Come posso verificare se esiste una directory?
risposta
È possibile utilizzare opendir()
e verificare se ENOENT == errno
in caso di fallimento:
DIR* dir = opendir("mydir");
if (dir)
{
/* Directory exists. */
closedir(dir);
}
else if (ENOENT == errno)
{
/* Directory does not exist. */
}
else
{
/* opendir() failed for some other reason. */
}
Il modo migliore è probabilmente provare ad aprirlo, usando solo opendir()
per esempio.
Si noti che è sempre meglio provare a utilizzare una risorsa di file system e gestire eventuali errori che si verificano perché non esiste, piuttosto che controllare e successivamente provare. C'è un'ovvia condizione di gara nell'ultimo approccio.
Si potrebbe utilizzare stat()
e passare l'indirizzo di una struct stat
, quindi controllare i suoi Stati st_mode
per avere S_IFDIR
set.
Altri due modi, forse meno corretto è quello di utilizzare. Il primo, utilizzando solo le librerie standard e solo per i file:
FILE *f;
f = fopen("file", "r")
if(!f)
printf("there is no file there");
Questo si potrebbe lavorare su tutto il sistema operativo.
o un altro anche per dirs, utilizzando la chiamata di sistema con system(). È l'opzione peggiore, ma ti dà un altro modo. Per qualcuno forse utile.
La domanda riguardava specificamente le directory, non i file. E ti consigliamo di chiamare 'system()', dovresti specificare quale argomento passare ad esso. –
"*' printf ("non c'è file lì") "*": non essere in grado di aprire come file non significa necessariamente che non esiste. Turing intorno: il codice potrebbe non riuscire a 'fopen()' un file esistente, ad esempio a causa di problemi di accesso. – alk
Secondo man(2)stat è possibile utilizzare la macro S_ISDIR sul campo st_mode:
bool isdir = S_ISDIR(st.st_mode);
Nota a margine, mi consiglia di utilizzare Boost e/o Qt4 per rendere il supporto cross-platform più facile se il software può essere vitale su altri sistemi operativi.
Utilizzare il codice seguente per verificare se esiste una cartella. Funziona su entrambe le piattaforme Linux di Windows &.
#include <stdio.h>
#include <sys/stat.h>
int main(int argc, char* argv[])
{
const char* folderr;
//folderr = "C:\\Users\\SaMaN\\Desktop\\Ppln";
folderr = "/tmp";
struct stat sb;
if (stat(folderr, &sb) == 0 && S_ISDIR(sb.st_mode))
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
Sei sicuro che le intestazioni incluse siano sufficienti, almeno per Linux? – alk
Si può anche usare in combinazione con access
opendir
per determinare se la directory esiste, e, se esiste il nome, ma non è una directory. Per esempio:
/* test that dir exists (1 success, -1 does not exist, -2 not dir) */
int
xis_dir (char *d)
{
DIR *dirptr;
if (access (d, F_OK) != -1) {
// file exists
if ((dirptr = opendir (d)) != NULL) {
closedir (dirptr);
} else {
return -2; /* d exists, but not dir */
}
} else {
return -1; /* d does not exist */
}
return 1;
}
Sono d'accordo che la seguente intestazione sono una delle migliori soluzioni:
#include <stdio.h>
#include <sys/stat.h>
Non hai bisogno di un codice di accompagnamento con le intestazioni per rispondere effettivamente alla domanda? –
Questo non fornisce una risposta alla domanda. – alk
Eventuali duplicati di [modo più veloce C per verificare se esiste una directory] (http: // StackOverflow. it/questions/9314586/c -velocità-più veloce-per-verificare-se-una-directory-esistente) –