2011-11-22 38 views
32

thể trùng lặp:
How do you check if a directory exists on Windows in C?Làm thế nào để kiểm tra xem thư mục tồn tại bằng C++ và WINAPI

Làm thế nào để kiểm tra xem một thư mục tồn tại bằng C++ và cửa sổ API?

+0

Có thể bạn có thể hiển thị những gì bạn có cho đến thời điểm này –

+0

tại sao không chỉ làm =========> BOOL PathFileExists (pszPath); <========= như hiển thị trong https://msdn.microsoft.com/en-us/library/windows/desktop/bb773584(v=vs.85).aspx? – Fractal

Trả lời

58

chúng tôi cũng là tất cả n0obs tại một thời điểm nào đó. Không có vấn đề trong yêu cầu. Đây là một chức năng đơn giản mà thực hiện chính xác này:

#include <windows.h> 
#include <string> 

bool dirExists(const std::string& dirName_in) 
{ 
    DWORD ftyp = GetFileAttributesA(dirName_in.c_str()); 
    if (ftyp == INVALID_FILE_ATTRIBUTES) 
    return false; //something is wrong with your path! 

    if (ftyp & FILE_ATTRIBUTE_DIRECTORY) 
    return true; // this is a directory! 

    return false; // this is not a directory! 
} 
+7

'GetFileAttributes()' trả về 'INVALID_FILE_ATTRIBUTES' khi xảy ra lỗi. Bạn phải sử dụng 'GetLastError()' để tìm ra lỗi thực sự là gì. Nếu nó trả về 'ERROR_PATH_NOT_FOUND',' ERROR_FILE_NOT_FOUND', 'ERROR_INVALID_NAME' hoặc' ERROR_BAD_NETPATH' thì nó thực sự không tồn tại. Nhưng nếu nó trả về hầu hết các lỗi khác, thì một cái gì đó thực sự tồn tại ở đường dẫn đã chỉ định nhưng các thuộc tính đơn giản là không thể truy cập được. –

+3

Đối với những người ngại về câu trả lời này, hãy nhớ rằng mã trên là ANSI không phải là Unicode. Đối với Unicode hiện đại, tốt hơn là lấy tham số LPCTSTR như đoạn mã trong câu trả lời stackoverflow khác: http://stackoverflow.com/a/6218445. (LPCTSTR sẽ được dịch thành 'wchar_t *' bởi trình biên dịch.). Sau đó bạn có thể bọc hàm nhận biết Unicode đó để lấy C++ 'std :: wstring' thay vì' std :: string'. – JasDev

4

0,1 giây tìm kiếm của Google:

BOOL DirectoryExists(const char* dirName) { 
    DWORD attribs = ::GetFileAttributesA(dirName); 
    if (attribs == INVALID_FILE_ATTRIBUTES) { 
    return false; 
    } 
    return (attribs & FILE_ATTRIBUTE_DIRECTORY); 
} 
6

Mã này có thể làm việc:

//if the directory exists 
DWORD dwAttr = GetFileAttributes(str); 
if(dwAttr != 0xffffffff && (dwAttr & FILE_ATTRIBUTE_DIRECTORY)) 
6

Nếu liên kết với vỏ Lightweight API (shlwapi .dll) phù hợp với bạn, bạn có thể sử dụng PathIsDirectory function

Các vấn đề liên quan