Làm cách nào để quét thư mục cho các thư mục và tệp trong C? Nó cần phải là nền tảng chéo.Làm thế nào để bạn có được danh sách thư mục trong C?
Trả lời
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
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)
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:
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
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.
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 đó.
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)
+1; Hàm có liên quan là 'g_dir_read_name()' – weiqure
Phương thức nhất tương tự có thể sử dụng số ít _find
family of functions ít được biết đến.
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);
Đ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
'bỏ phiếu' cho tinydir.h, Tốt lắm. –
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;
}
- 1. Làm thế nào để bạn có được danh sách thư mục được sắp xếp theo ngày tạo trong python?
- 2. Làm thế nào để có được danh sách thư viện chia sẻ thực thi từ C++?
- 3. Làm thế nào để có được danh mục hiện tại?
- 4. Làm thế nào để có được một chìa khóa ModelState của một mục trong danh sách
- 5. Làm cách nào để có được kích thước thư mục (tệp trong thư mục) trong C#?
- 6. Làm thế nào để bạn có một danh sách có sẵn trong migradoc/pdfsharp
- 7. Android, làm cách nào để có danh sách tất cả các tệp trong một thư mục?
- 8. Lấy danh sách các thư mục trong một thư mục
- 9. Trong Ruby, làm thế nào để bạn liệt kê/sắp xếp các tập tin trước các thư mục trong danh sách thư mục?
- 10. C# HttpWebRequest lệnh để lấy danh sách thư mục
- 11. * FASTEST * danh sách thư mục
- 12. Làm cách nào để có danh sách tất cả tên tệp trong thư mục bằng VB6?
- 13. Làm thế nào để có được một danh sách với thư viện cấu hình typesafe
- 14. Làm thế nào để có được danh sách các giám đốc trong NSDocumentDirectory?
- 15. Làm thế nào để có được một số mục danh sách từ Listview?
- 16. Làm thế nào để đạt được danh sách list.list để sao chép danh sách trong smooks
- 17. Làm thế nào tôi có thể lấy danh sách thư mục trước sau khi mở một tệp từ danh sách thư mục/tệp?
- 18. Làm cách nào để có danh sách các khóa được lập chỉ mục trong Titan?
- 19. Làm thế nào để tắt danh sách thư mục cho WebAppContext của Jetty?
- 20. Danh sách thư mục Sharpssh
- 21. làm thế nào để có được danh sách các mã hóa được hỗ trợ bởi thư viện iconv trong php?
- 22. Làm thế nào để tôi nhận được danh sách các thư mục và thư mục con mà không có các tập tin
- 23. Làm thế nào bạn có thể tự động tạo các mục danh sách vào một danh sách không có thứ tự trong ASP.NET?
- 24. Làm cách nào để kiểm tra xem tất cả các mục trong danh sách có trong danh sách khác không?
- 25. Làm thế nào để bạn sử dụng một regex trong một danh sách hiểu trong Python?
- 26. Danh sách C# trong đó các mục có TTL
- 27. Làm cách nào để có được danh sách các mục tiêu xây dựng trong Ant?
- 28. Làm thế nào để bạn có được con đường của bạn trong Octave (trên Windows)?
- 29. danh sách thư mục một phần
- 30. Làm thế nào để có được các dịch vụ OData của danh sách trong SharePoint 2010
này nên làm việc trên Windows là tốt, ít nhất là với MinGW. –
@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
Điều gì về điều này: 'error: unknown type name 'off64_t'' –