Dato un percorso, ad esempio/home/shree/percorso/def, vorrei determinare se def è una directory o un file. C'è un modo per ottenere questo in codice C o C++?Distinguere tra una directory e un file Unix in C e C++
risposta
Il codice seguente utilizza la funzione stat()
e S_ISDIR
('è una directory') e S_ISREG
('è un file regolare') le macro per ottenere informazioni sul file. Il resto è solo un controllo degli errori e abbastanza per fare un programma compilabile completo.
#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
int main (int argc, char *argv[]) {
int status;
struct stat st_buf;
// Ensure argument passed.
if (argc != 2) {
printf ("Usage: progName <fileSpec>\n");
printf (" where <fileSpec> is the file to check.\n");
return 1;
}
// Get the status of the file system object.
status = stat (argv[1], &st_buf);
if (status != 0) {
printf ("Error, errno = %d\n", errno);
return 1;
}
// Tell us what it is then exit.
if (S_ISREG (st_buf.st_mode)) {
printf ("%s is a regular file.\n", argv[1]);
}
if (S_ISDIR (st_buf.st_mode)) {
printf ("%s is a directory.\n", argv[1]);
}
return 0;
}
piste del campione sono mostrati qui:
pax> vi progName.c ; gcc -o progName progName.c ; ./progName
Usage: progName
where is the file to check.
pax> ./progName /home
/home is a directory.
pax> ./progName .profile
.profile is a regular file.
pax> ./progName /no_such_file
Error, errno = 2
Utilizzare la chiamata di sistema stat (2). È possibile utilizzare la macro S_ISREG o S_ISDIR nel campo st_mode per verificare se il percorso specificato è un file o una directory. La pagina man ti dice di tutti gli altri campi.
In alternativa è possibile utilizzare la funzione di sistema() con in "test" costruita comando di shell.
sistema restituisce lo stato di uscita del comando eseguito lo scorso
string test1 = "test -e filename" ; if(!system(test1)) printf("filename exists") ; string test2 = "test -d filename" ; if(!system(test2)) printf("filename is a directory") ; string test3 = "test -f filename" ; if(!system(test3)) printf("filename is a normal file") ;
ma temo questo dovrebbe funzionare solo su linux ..
Problematico se il nome del file contiene spazi vuoti, penso che dovresti scappare. – Paggas
Mentre funzionerebbe, le prestazioni lasceranno molto a desiderare. Ogni chiamata a system() esegue il fork e quindi esegue una nuova shell per interpretare il comando. –
Cosa succede ad usare il boost :: biblioteca filesystem e la sua is_directory (Percorso const & p)? Potrebbe volerci un po 'per familiarizzare, ma non così tanto. Probabilmente vale l'investimento e il tuo codice non sarà specifico per la piattaforma.
- 1. Distinguere tra cartelle e file in C++
- 2. Distinguere una pipe da un file in Unix
- 3. distinguere tra 0 e ""
- 4. Creare una directory e copiare un file
- 5. Differenze tra struct in C e C++
- 6. Distinguere tra applicationDidEnterBackground e applicationWillTermimate
- 7. Differenza tra nice e setpriority in unix
- 8. C++ gestito per formare un ponte tra C# e C++
- 9. Eliminazione ricorsiva di file e directory in C#
- 10. Come distinguere tra più dispositivi di input in C#
- 11. Condivisione di variabili tra C# e C++
- 12. Come distinguere tra un getter e un setter e una semplice proprietà in JavaScript?
- 13. Come distinguere tra una sequenza e una mappatura
- 14. Come faccio a distinguere tra file "binari" e "testo"?
- 15. C'è qualche differenza tra C c; e C c = C() ;?
- 16. Come distinguere tra iphone4 e iphone 3
- 17. Come posso distinguere un file dalla directory in Python?
- 18. Distinguere tra un solo clic e doppio clic in Java
- 19. Come distinguere tra un iteratore e un iterabile?
- 20. Distinguere tra intranet e indirizzi IP ufficiali
- 21. Come distinguere tra programmatore e JVM eccezioni
- 22. C++ Come ottenere un nome file (e percorso) del modulo .so in esecuzione in Unix
- 23. UIDeviceOrientationFaceUp - come distinguere tra verticale e orizzontale?
- 24. IPC tra Python e C#
- 25. Comunicazione tra SAP e C#
- 26. serializzazione shared_ptr e tra applicazioni C# e C++?
- 27. Come distinguere tra richieste HTTP e cli?
- 28. Distinguere tra iPhone 4 e iPhone 4S
- 29. c'è una differenza tra una struct in C++ e una struct in C#?
- 30. Come distinguere tra un elemento e un vettore di lunghezza 1 in R?
il codice è un po 'macchinoso a causa del controllo degli errori. Suggerisco di rimuoverlo e aggiungere commenti come "verifica errori: file inesistente, argomenti non sufficienti". Penso che renderà la tua risposta un po 'migliore –
Lo preferisco con il controllo degli errori, dato che spesso è lasciato fuori dagli esempi e le persone non sanno necessariamente come rimetterlo. –
L'ho lasciato, ma chiarito nel testo quali sono i bit importanti. – paxdiablo