2008-08-15 32 views

Trả lời

5

opendir/readdir là POSIX. Nếu POSIX là không đủ cho tính di động mà bạn muốn đạt được, kiểm tra Apache Portable Runtime

68

Sau đây sẽ in tên của các tập tin trong thư mục hiện hành:

#include <stdio.h> 
#include <sys/types.h> 
#include <dirent.h> 

int main (void) 
{ 
    DIR *dp; 
    struct dirent *ep;  
    dp = opendir ("./"); 

    if (dp != NULL) 
    { 
    while (ep = readdir (dp)) 
     puts (ep->d_name); 

    (void) closedir (dp); 
    } 
    else 
    perror ("Couldn't open the directory"); 

    return 0; 
} 

(tín dụng: http://www.gnu.org/software/libtool/manual/libc/Simple-Directory-Lister.html)

+1

này nên làm việc trên Windows là tốt, ít nhất là với MinGW. –

+1

@Clayton nhưng tôi đã được dạy rằng không bao giờ sử dụng puts() vì nó không biết có bao nhiêu ký tự để in? – YakRangi

+0

Điều gì về điều này: 'error: unknown type name 'off64_t'' –

18

Các câu trả lời nghiêm ngặt là "bạn không thể", vì chính khái niệm về một thư mục không thực sự đa nền tảng.

Trên nền tảng MS, bạn có thể sử dụng _findfirst, _findnext và _findclose cho loại cảm biến 'c', và FindFirstFile và FindNextFile cho các cuộc gọi Win32 cơ bản.

Đây là C-FAQ câu trả lời:

http://c-faq.com/osdep/readdir.html

+0

có bí danh đã được thiết lập cho _findfirst, _findnext và _findclose ở đâu đó không? không phải trong windows.h phải không? – BuddyJoe

9

Không có C (hoặc C++) cách tiêu chuẩn để liệt kê các tập tin trong một thư mục.

Trong Windows, bạn có thể sử dụng chức năng FindFirstFile/FindNextFile để liệt kê tất cả các mục nhập trong một thư mục. Trong Linux/OSX, sử dụng các hàm opendir/readdir/closedir.

+0

Boost :: filesystem ?? – paxos1977

+1

@ceretullis: Lưu ý từ "tiêu chuẩn" .. Tăng chưa đạt tiêu chuẩn .. – krebstar

+23

Tăng cường cũng không phải là C. –

2

Danh sách thư mục thay đổi rất nhiều tùy theo hệ điều hành/nền tảng đang được xem xét. Điều này là do, các hệ điều hành khác nhau sử dụng các cuộc gọi hệ thống nội bộ của riêng chúng để đạt được điều này.

Giải pháp cho vấn đề này là tìm thư viện che giấu vấn đề này và di chuyển. Thật không may, không có giải pháp nào hoạt động trên tất cả các nền tảng hoàn hảo.

Trên hệ thống tương thích POSIX, bạn có thể sử dụng thư viện để đạt được điều này bằng mã được Clayton đăng (được tham chiếu ban đầu từ Lập trình nâng cao theo sách UNIX của W. Richard Stevens). giải pháp này sẽ hoạt động trong các hệ thống * NIX và cũng sẽ hoạt động trên Windows nếu bạn cài đặt Cygwin. Ngoài ra, bạn có thể viết mã để phát hiện hệ điều hành cơ bản và sau đó gọi hàm liệt kê thư mục thích hợp, giữ chức năng 'thích hợp' để liệt kê cấu trúc thư mục trong hệ điều hành đó.

7

GLib là thư viện tiện ích/tiện ích cho C, là cơ sở của bộ công cụ đồ họa GTK +. Nó có thể được sử dụng như một thư viện độc lập.

Nó chứa trình bao bọc di động để quản lý thư mục. Xem tài liệu Glib File Utilities để biết chi tiết.

Cá nhân, tôi thậm chí sẽ không cân nhắc viết một lượng lớn mã C mà không có thứ gì đó giống như GLib phía sau tôi. Khả năng di chuyển là một điều, nhưng cũng rất tốt khi nhận cấu trúc dữ liệu, trình trợ giúp chuỗi, sự kiện, vòng lặp chính, v.v.

Jikes, tôi gần như bắt đầu phát âm giống như một anh chàng bán hàng :) (đừng lo, glib là mã nguồn mở (LGPL) và tôi không liên kết với nó theo bất kỳ cách nào)

+2

+1; Hàm có liên quan là 'g_dir_read_name()' – weiqure

13

Tôi đã tạo một tiêu đề C nguồn mở (BSD) giao dịch với vấn đề này. Nó hiện hỗ trợ POSIX và Windows. Vui lòng kiểm tra nó ra:

https://github.com/cxong/tinydir

tinydir_dir dir; 
tinydir_open(&dir, "/path/to/dir"); 

while (dir.has_next) 
{ 
    tinydir_file file; 
    tinydir_readfile(&dir, &file); 

    printf("%s", file.name); 
    if (file.is_dir) 
    { 
     printf("/"); 
    } 
    printf("\n"); 

    tinydir_next(&dir); 
} 

tinydir_close(&dir); 
+0

Điều này giúp ích gì hơn so với việc triển khai phụ thuộc hệ thống gốc? Hoặc là nó để bạn chỉ cần một thư viện được đặt tên cho Windows và POSIX? – kevr

+0

'bỏ phiếu' cho tinydir.h, Tốt lắm. –

-1

Bạn có thể tìm thấy những mẫu mã trên wikibooks link

/************************************************************** 
* A simpler and shorter implementation of ls(1) 
* ls(1) is very similar to the DIR command on DOS and Windows. 
**************************************************************/ 
#include <stdio.h> 
#include <dirent.h> 

int listdir(const char *path) 
{ 
    struct dirent *entry; 
    DIR *dp; 

    dp = opendir(path); 
    if (dp == NULL) 
    { 
    perror("opendir"); 
    return -1; 
    } 

    while((entry = readdir(dp))) 
    puts(entry->d_name); 

    closedir(dp); 
    return 0; 
} 

int main(int argc, char **argv) { 
    int counter = 1; 

    if (argc == 1) 
    listdir("."); 

    while (++counter <= argc) { 
    printf("\nListing %s...\n", argv[counter-1]); 
    listdir(argv[counter-1]); 
    } 

    return 0; 
} 
Các vấn đề liên quan