2012-02-16 57 views
20

Tôi đang sử dụng chức năng opendir để kiểm tra xem thư mục có tồn tại không. Vấn đề là tôi đang sử dụng nó trên một vòng lặp lớn và nó thổi phồng ram được sử dụng bởi ứng dụng của tôi.C cách nhanh hơn để kiểm tra xem thư mục có tồn tại không

Cách tốt nhất (nhanh nhất) để kiểm tra xem thư mục có tồn tại trong C không? Cách tốt nhất (nhanh nhất) để tạo nó nếu không tồn tại là gì?

+7

Câu hỏi ngớ ngẩn, bạn có gọi 'closeir()' sau đó không? – user7116

+0

Và cách nhanh hơn có thể là làm điều đó một cách không đồng bộ, nhưng bạn nên xem xét khả năng của phương tiện của bạn. Nếu nó là HDD thường xuyên thì nó có thể thất bại trong cơn bão tìm kiếm và điều này sẽ làm việc chậm. Nhưng nếu bạn sử dụng RAID/SSD hoặc thậm chí làm việc trong đám mây, điều này sẽ hoạt động. – LiMar

Trả lời

16

Bạn có thể gọi mkdir(). Nếu thư mục không tồn tại thì thư mục đó sẽ được tạo và 0 sẽ được trả lại. Nếu thư mục tồn tại thì -1 sẽ được trả lại và errno sẽ được đặt thành EEXIST.

+2

Với báo trước rằng 'ENOENT' có thể xảy ra nếu một cái gì đó dọc theo đường dẫn không tồn tại. – user7116

+0

Đúng. Nên đã đề cập điều đó. – ckruse

+2

Có nhanh hơn chỉ số không? –

2

Tôi sẽ sử dụng stat(), nếu có.

39

Cân nhắc sử dụng stat. S_ISDIR(s.st_mode) sẽ cho bạn biết nếu đó là một thư mục.

mẫu:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 

... 
struct stat s; 
int err = stat("/path/to/possible_dir", &s); 
if(-1 == err) { 
    if(ENOENT == errno) { 
     /* does not exist */ 
    } else { 
     perror("stat"); 
     exit(1); 
    } 
} else { 
    if(S_ISDIR(s.st_mode)) { 
     /* it's a dir */ 
    } else { 
     /* exists but is no dir */ 
    } 
} 
... 
+1

nhanh hơn so với opendir? –

+3

Điều đó phụ thuộc vào hệ điều hành và số mục nhập có trong thư mục mẹ. Nó sẽ nhanh hơn theo bất kỳ cách nào và đó là những gì 'stat' được tạo ra. –

+0

Linux 64 bit, 1 mục nhập –

0

Có vẻ như bạn có một rò rỉ bộ nhớ. Gọi opendir không nên thổi phồng bộ nhớ RAM của ứng dụng của bạn miễn là bạn nhớ luôn luôn gọi shutir sau khi mở thư mục thành công. Ngoài ra, hãy chắc chắn rằng bạn đang giải phóng bất kỳ bộ đệm nào bạn đã phân bổ để tính toán tên thư mục.

+0

Yeap Tôi đang đóng nó, tôi sẽ chỉ sử dụng stat, cảm ơn thời gian của bạn! –

16

Tôi thích sử dụng access()

if (0 != access("/path/to/possible_dir/", F_OK)) { 
    if (ENOENT == errno) { 
    // does not exist 
    } 
    if (ENOTDIR == errno) { 
    // not a directory 
    } 
} 

Nếu bạn đảm bảo một trailing / trong tên thư mục, điều này hoạt động hoàn hảo.

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