Podając ścieżkę, powiedz,/home/shree/path/def, chciałbym określić, czy def jest katalogiem czy plikiem. Czy istnieje sposób osiągnięcia tego w C lub C++?Rozróżnianie katalogu unix i pliku w C i C++
Odpowiedz
Poniższy kod wykorzystuje funkcję stat()
i S_ISDIR
(„jest katalogiem”) i S_ISREG
(„jest zwykłym plikiem”) makra, aby uzyskać informacje na temat pliku. Reszta to po prostu sprawdzanie błędów i wystarczająca do stworzenia kompletnego programu do kompilacji.
#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;
}
Przykładowe przebiegi pokazane są tutaj:
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
Użyj wywołania systemowego stat (2). Możesz użyć makra S_ISREG lub S_ISDIR w polu st_mode, aby sprawdzić, czy podana ścieżka jest plikiem lub katalogiem. Strona podręcznika informuje o wszystkich innych polach.
Alternatywnie można użyć system() w funkcji z wbudowanym poleceń shell "test". System
zwraca kod zakończenia ostatniego polecenia wykonywane
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") ;
ale obawiam się, to będzie działać tylko na linux ..
Problematyczne, jeśli nazwa pliku zawiera białe znaki, myślę, że musiałbyś uciec przed tym. – Paggas
Podczas gdy to zadziała, wydajność pozostawi wiele do życzenia. Każde wywołanie system() rozwidnia się, a następnie wykona nową powłokę, aby zinterpretować polecenie. –
Co na temat korzystania z biblioteki boost :: systemu plików i jej is_directory (const Path & p)? Zapoznanie się z nim może zająć trochę czasu, ale nie za bardzo. Prawdopodobnie jest wart inwestycji, a twój kod nie będzie zależny od platformy.
- 1. Rozróżnianie folderów i plików w C++
- 2. Usunięcie pliku w C++ pod UNIX
- 3. Parsowanie czasu unix w C#
- 4. Unix konwersji czasu w C#
- 5. Czytanie i pisanie na środku pliku binarnego w C/C++
- 6. Odczytywanie i przetwarzanie danych pliku WAV w języku C/C++
- 7. Mieszanie C++ i Objective C
- 8. Unix i FreeBSD
- 9. Otwieranie pliku w systemie Unix przy użyciu C++
- 10. Wysyłanie i odbieranie pliku (serwer/klient) w C przy użyciu gniazda na Unix
- 11. Łączenie C++ i C#
- 12. Rozróżnianie między nginx i cienkim
- 13. Jednostka tłumaczeniowa w C i C++
- 14. debugowanie C++: ../nptl/sysdeps/unix/sysv/linux/raise.c: Brak takiego pliku lub katalogu
- 15. Matlab w C C++ i C C++ w matlab
- 16. Gniazda domenowe i kakao UNIX
- 17. Rozróżnianie przeciągnięć i klikanie w kątowe
- 18. Lista funkcji C/C++ (Analiza kodu w systemie Unix)
- 19. Implementowanie potoków w powłoce C (Unix)
- 20. Różnice w lotności w C# i C
- 21. Pliki w katalogu w C++
- 22. Zmienianie katalogu roboczego w C?
- 23. C# - Zapisywanie DataGridView do pliku i ładowanie
- 24. Moduły C++ i C++ ABI
- 25. Native C++ i C# interop
- 26. Różnice między C: i C:/
- 27. dlopen i zmienne globalne w C/C++
- 28. Makro redefinicja w C i C++
- 29. Wyświetlanie zawartości katalogu przy użyciu C i Windows
- 30. C# development i project.json
Twój kod jest nieco kłopotliwy z powodu sprawdzania błędów. Sugeruję usunięcie tego i dodanie komentarza, np. "Sprawdź błędy: plik nie istnieje, za mało argumentów". Myślę, że to trochę poprawi twoją odpowiedź. –
Wolę to od sprawdzania błędów, ponieważ często jest to pomijane w przykładach, a ludzie niekoniecznie wiedzą, jak go ponownie umieścić. –
Zostawiłem to, ale wyjaśniono w tekście, jakie są ważne elementy. – paxdiablo