2010-10-26 35 views
8

Tôi phải làm một chương trình mà tôi cần lập chỉ mục các tệp trong một thư mục được chỉ định. Tôi đã nhận được một phần chỉ mục xuống, nhưng những gì tôi đang gặp rắc rối là làm thế nào để điều hướng đến thư mục. Ví dụ, khi tôi bắt đầu chương trình, nó sẽ hỏi "Bạn muốn lập chỉ mục thư mục nào", và sau đó đầu vào sẽ là "usr/Documents/CS/Assignment4", làm cách nào để vào thư mục "Assignment4" ? Tôi biết đệ quy là cần thiết, nhưng tôi thực sự bối rối như thế nào thư mục làm việc trong C. Nói tập tin nguồn của tôi là trong "usr/Documents/SourceCode", sau đó tôi nên làm gì để có được Assignment4?Trong C, làm cách nào để truy cập vào một thư mục được chỉ định?

Tôi biết tôi có vẻ như tôi muốn tất cả các câu trả lời, nhưng tôi hoàn toàn bị mất về cách thức các thư mục hoạt động và cuốn sách tôi đã hút. Vì vậy, ngay cả khi tất cả các bạn có là một liên kết đến một hướng dẫn tốt về điều này, đó sẽ là tuyệt vời.

Tôi đang chạy Linux, Ubuntu chính xác. GCC là trình biên dịch.

+0

Một giải pháp đơn giản có thể là chạy chương trình trong thư mục bạn muốn lập chỉ mục. Có vẻ như bạn đang viết tiện ích hệ thống 'ls -e':) – Marm0t

Trả lời

7

Ngôn ngữ lập trình C không có khái niệm về hệ thống tệp. Đây là một câu hỏi cụ thể cho hệ điều hành.

Dựa trên kiểu thư mục trong câu hỏi của bạn mặc dù có vẻ như bạn đang sử dụng hệ thống kiểu unix/linux. Nếu đó là trường hợp sau đó bạn đang tìm kiếm opendir chức năng

0

Tên của thư mục chỉ là một chuỗi.

Vì vậy, opendir ("tên tệp"); sẽ làm cho nó có thể đọc thư mục "tập tin".

Tuy nhiên, bạn có lẽ nên bắt đầu suy nghĩ về tên tệp và đường dẫn.

"usr/Documents/SourceCode" + "/../CS/Assignment4" giống với "usr/Documents/CS/Assignment4" tuy nhiên tôi cho rằng bạn đang thiếu "/" hàng đầu.

Vâng, tôi không hiểu cách bạn có thể bị mất cách thư mục hoạt động. Một thư mục không khác gì "thư mục" trong Windows hoặc Mac OS X. Dòng dưới cùng là ổ đĩa cứng có hệ tập tin và hệ thống tập tin chỉ bao gồm thư mục/thư mục chứa tập tin "" (và các tập tin đặc biệt như ổ cắm có tên vv , điều này không nên làm bạn quan tâm ngay bây giờ).

Hy vọng điều này sẽ giúp ít nhất một chút.

Angelo

+0

Tôi xin lỗi, tôi đã nói sai. không bị mất như thế nào thư mục làm việc, chỉ làm thế nào để làm việc với họ trong C. Giống như cách thư mục đi qua, vv – sx2000

1

đệ quy đi qua một thư mục trong C đi một cái gì đó như thế này:

Sử dụng opendirreaddir để liệt kê các mục thư mục. Tôi có lẽ không nên làm điều này, nhưng tôi đăng một mẫu mã đầy đủ (xử lý lỗi sans) vì có một số điều nhỏ bạn phải làm để đảm bảo bạn đang sử dụng API chính xác:

DIR   *dir; 
struct dirent *de; 
const char *name; 

dir = opendir(dirpath); 
if (dir == NULL) { 
    /* handle error */ 
} 

for (;;) { 
    errno = 0; 
    de = readdir(dir); 
    if (de == NULL) { 
     if (errno != 0) { 
      /* handle error */ 
     } else { 
      /* no more entries left */ 
      break; 
     } 
    } 

    /* name of file (prefix it with dirpath to get a usable file path) */ 
    name = de->d_name; 

    /* ignore . and .. */ 
    if (name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) 
     continue; 

    /* do something with the file */ 
} 

if (closedir(dir) != 0) { 
    /* handle error */ 
} 

Khi làm việc với mỗi tệp, hãy nhớ thêm đường dẫn dirpath vào nó (cùng với dấu gạch chéo, nếu cần). Bạn cũng có thể sử dụng chdir để đi xuống và đi lên, nhưng nó giới thiệu các biến chứng trong thực tế (ví dụ: bạn không thể duyệt hai thư mục cùng lúc), vì vậy tôi khuyên bạn nên giữ thư mục làm việc hiện tại của bạn tĩnh và sử dụng thao tác chuỗi để nối đường dẫn.

Để tìm hiểu xem một con đường là một thư mục hay không (và do đó cho dù bạn nên opendir() nó), tôi khuyên bạn sử dụng lstat() hơn stat(), vì sau đó sau liên kết tượng trưng, ​​có nghĩa traversal thư mục của bạn có thể bị kẹt trong một vòng lặp và bạn sẽ kết thúc với một cái gì đó like this ctags output.

Tất nhiên, vì cấu trúc thư mục có tính đệ quy trong tự nhiên, đệ quy đóng một vai trò tự nhiên trong quá trình truyền tải: thực hiện cuộc gọi đệ quy khi đường dẫn con là một thư mục.

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