2008-09-28 9 views

Odpowiedz

26

Zadzwoń pod GetFileAttributes i sprawdź atrybut FILE_ATTRIBUTE_DIRECTORY.

+3

Jeśli potrzebujesz obsługi systemu Windows 98, nie możesz korzystać z tej funkcji. Poniżej znajdziesz moją odpowiedź na temat PathIsDirectory, jeśli potrzebujesz obsługi Win98. – jeffm

85

stat() powie Ci to.

struct stat s; 
if(stat(path,&s) == 0) 
{ 
    if(s.st_mode & S_IFDIR) 
    { 
     //it's a directory 
    } 
    else if(s.st_mode & S_IFREG) 
    { 
     //it's a file 
    } 
    else 
    { 
     //something else 
    } 
} 
else 
{ 
    //error 
} 
+2

Jedyny problem jaki mam z tym kodem jest komentarzem w innym przypadku. To, że coś nie jest katalogiem, nie oznacza, że ​​jest to plik. – dicroce

+0

@dicroce: Tak, to prawda; naprawiony. –

+0

kiedy próbuję użyć tego, mam "agregatową" główną (int, char **) :: stat s 'ma niekompletny typ i nie można go zdefiniować "i naprawdę nie mógł dostać tego, co jest błędem. Daje błąd najpierw w linii struct stat s; Jaki mógł być mój błąd? – MeM

13

W Win32, zazwyczaj używam PathIsDirectory i jego funkcji siostrzanych. To działa w systemie Windows 98, który GetFileAttributes nie (według dokumentacji MSDN.)

+3

Czy to działa w systemie Windows 3.11? – pilkch

+1

Nie próbowałem tego, ale najwcześniejsza udokumentowana wersja została rozprowadzona w systemie Windows 95, więc prawdopodobnie nie. – jeffm

+0

Możesz oczywiście użyć 'GetFileAttributes()' w Windows 98, a AFAIK przed istniejącym 'PathIsDirectory()'. Nie można polegać na dokumentacji MSDN podczas sprawdzania minimalnego wymagania systemu operacyjnego API, ponieważ MSDN leży! Kiedy MS rezygnuje z obsługi wersji systemu operacyjnego, wolą usunąć większość odniesień do niej z dokumentacji MSDN, szczególnie w przypadku minimalnych wymagań systemu operacyjnego istniejących interfejsów API. –

-1

Łatwiejszy spróbować FileInfo.isDir() w Qt

+0

Proszę, rozwiń swoją odpowiedź. Dołącz przykładowy kod itp. –

+6

Czy możesz wyjaśnić, dlaczego użyć biblioteki GUI, gdy chodzi o dostęp do systemu plików? – harper

+0

Dzięki, właśnie tego szukałem. (Przez Google.) – ens

-1

Jeśli używasz CFile można spróbować

CFileStatus status; 
    if (CFile::GetStatus(fileName, status) && status.m_attribute == 0x10){ 
     //it's directory 
} 
+0

nie może w rzeczywistości zawierać pliku protokołu API. – Kasparov92

3

W C++ 14/C++ 17 można użyć niezależnej platformy is_directory() i is_regular_file() od filesystem library.

#include <filesystem> // C++17 (or Microsoft-specific implementation in C++14) 

std::string pathString = "/my/path"; 
std::filesystem::path path(pathString); // Construct the path from a string. 
if (path.is_directory()) { // Using the non-throwing overload. 
    // Process a directory. 
} 
if (path.is_regular_file()) { // Using the non-throwing overload. 
    // Process a regular file. 
} 

W języku C++ 14 użyj std::experimental::filesystem.

#include <experimental/filesystem> // C++14 

std::experimental::filesystem::path path(pathString); 

W sekcji File types dostępnych jest więcej czeków.