2010-10-24 12 views
5

tôi có đường dẫn đến một thư mục ví dụLấy danh sách các tập tin trong một thư mục sử dụng C

/Myfolder

hoặc trong Windows:

C: \ Myfolder

và tôi muốn nhận danh sách tất cả các tệp trong thư mục đó. Làm thế nào tôi sẽ làm như vậy trong C?

Có khác biệt trong C++ hoặc C99 không?

Làm cách nào để có danh sách các thư mục của nó?

Mọi trợ giúp đều được đánh giá cao.

+2

Câu hỏi này không liên quan gì đến C hoặc C++ nhưng với hệ điều hành bạn đang sử dụng. Xin hãy chính xác hơn. –

+0

@Jens Uh? Bạn thấy sự mơ hồ ở đâu? Cộng với nó có rất nhiều việc phải làm với C hoặc C++. –

+3

C là ngôn ngữ có IO trên các tệp, nhưng thậm chí không biết khái niệm thư mục. Thư mục là một khái niệm hệ điều hành, do đó, để nói bất cứ điều gì hữu ích để trả lời câu hỏi đó bạn phải biết hệ điều hành. –

Trả lời

4

Trong các hệ thống điều hành POSIX, bạn có thể gọi opendir() và readdir(). Trong Windows, bạn có thể gọi _findfirst() và _findnext(). Với một chút nỗ lực, bạn có thể thực hiện các hàm opendir() và readdir() của riêng bạn như các hàm bao bọc trong Windows, để mã ứng dụng của bạn có thể sử dụng cùng một API ở mọi nơi. Một ví dụ về điều đó có thể được tìm thấy here.

0

Đây là nhiệm vụ cổ điển, một giải pháp sở hữu có thể tìm thấy trong Kernigan & Ritchie - Ngôn ngữ lập trình C (Chương 8.6). Bản chất của tác vụ là đi qua đệ quy của thư mục đích và các thư mục con của nó.

+0

Tại sao điều này lại bị bỏ phiếu? Câu trả lời * là * trong chương này trong cuốn sách này.Tôi đoán nó đã bị bỏ phiếu vì bạn phải sở hữu một bản sao trước? http://www.amazon.co.uk/C-Programming-Language-2nd/dp/0131103628 Thật đáng để mua nếu bạn đang học C. –

+0

@GaryWilloughby: Chiếc váy này rất gần nơi K & R 2 thể hiện tuổi của nó. Có một hàm 'dirwalk()' trong chương có thể sử dụng được. Gần như ngay sau đó, có một mẫu thực hiện 'opendir()', 'readdir()', 'closedir()' không sử dụng trên bất kỳ hệ thống Unix nào - nhưng được sử dụng để làm việc trong những năm 80 và đầu những năm 90. (Tôi không chắc chắn chính xác khi nào nó ngừng hoạt động, nó phụ thuộc vào nền tảng, một phần, nhưng hầu hết POSIX-ish O/S đã chuyển sang "bạn phải sử dụng' opendir() 'et al và không thể sử dụng nó từ K & R 2 nữa "bằng cách, nói, 2005, và có lẽ khá sớm hơn rất nhiều.) –

+0

Tôi nói" 'dirwalk()' có thể sử dụng được ". Nó đòi hỏi một số chỉnh sửa nhỏ để làm cho nó có thể sử dụng được với tiêu chuẩn POSIX 'opendir()' et al. Kiểu 'Dirent' cần trở thành' struct dirent' (hoặc bạn cần thêm 'typedef struct dirent Dirent;') và tham chiếu đến 'dp-> name' cần phải được thay đổi thành' dp-> d_name'. –

4

Bạn có thể sử dụng các chức năng khai báo trong dirent.h

dirent.h là tiêu đề trong thư mục C POSIX thư viện cho các ngôn ngữ lập trình C có chứa các cấu trúc mà tạo điều kiện cho thư mục traversing. Hàm không phải là một phần của tiêu chuẩn C , nhưng được coi là "chuẩn giả" và thường là di động giữa các nền tảng.
http://en.wikipedia.org/wiki/Dirent.h

#include <dirent.h> 

int main(int argc, char **argv) 
{ 
    DIR *dir; 
    struct dirent *de; 

    dir = opendir("."); /*your directory*/ 
    while(dir) 
    { 
     de = readdir(dir); 
     if (!de) break; 
     printf("%i %s\n", de->d_type, de->d_name); 
    } 
    closedir(dir); 
    return 0; 
} 
1

Kiểm tra các get_all_files_within_folder() tôi đã viết trong C/C++ here, mà tôi đã trả lời một câu hỏi tương tự như bạn. Nó hoạt động hoàn hảo cho tôi. Hy vọng nó giúp.