Với đường dẫn,/home/shree/path/def, tôi muốn xác định xem def là một thư mục hay tệp. Có cách nào để đạt được điều này trong mã C hoặc C++ không?Phân biệt giữa thư mục và tệp unix trong C và C++
Trả lời
Mã sau sử dụng chức năng stat()
và các mẫu S_ISDIR
('là thư mục') và S_ISREG
('là tệp thông thường') để nhận thông tin trên tệp. Phần còn lại chỉ là kiểm tra lỗi và đủ để thực hiện một chương trình hoàn chỉnh.
#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
int main (int argc, char *argv[]) {
int status;
struct stat st_buf;
// Ensure argument passed.
if (argc != 2) {
printf ("Usage: progName <fileSpec>\n");
printf (" where <fileSpec> is the file to check.\n");
return 1;
}
// Get the status of the file system object.
status = stat (argv[1], &st_buf);
if (status != 0) {
printf ("Error, errno = %d\n", errno);
return 1;
}
// Tell us what it is then exit.
if (S_ISREG (st_buf.st_mode)) {
printf ("%s is a regular file.\n", argv[1]);
}
if (S_ISDIR (st_buf.st_mode)) {
printf ("%s is a directory.\n", argv[1]);
}
return 0;
}
mẫu chạy được hiển thị ở đây:
pax> vi progName.c ; gcc -o progName progName.c ; ./progName
Usage: progName
where is the file to check.
pax> ./progName /home
/home is a directory.
pax> ./progName .profile
.profile is a regular file.
pax> ./progName /no_such_file
Error, errno = 2
Sử dụng chỉ số (2) cuộc gọi hệ thống. Bạn có thể sử dụng macro S_ISREG hoặc S_ISDIR trên trường st_mode để xem đường dẫn đã cho là tệp hay thư mục. Trang hướng dẫn cho bạn biết về tất cả các trường khác.
Hoặc bạn có thể sử dụng hệ thống() chức năng với trong xây dựng lệnh shell "test".
hệ thống sẽ trả về trạng thái thoát của lệnh cuối cùng được thực hiện
string test1 = "test -e filename" ; if(!system(test1)) printf("filename exists") ; string test2 = "test -d filename" ; if(!system(test2)) printf("filename is a directory") ; string test3 = "test -f filename" ; if(!system(test3)) printf("filename is a normal file") ;
nhưng tôi sợ điều này sẽ chỉ hoạt động trên Linux ..
Vấn đề nếu tên tệp chứa khoảng trắng, tôi nghĩ bạn phải thoát khỏi nó. – Paggas
Trong khi điều này sẽ làm việc, hiệu suất sẽ để lại rất nhiều để được mong muốn. Mỗi cuộc gọi đến hệ thống() sẽ fork và sau đó exec một shell mới để giải thích lệnh. –
gì về việc sử dụng tăng :: thư viện hệ thống tập tin và is_directory (Path const của nó & p)? Có thể mất một lúc để làm quen, nhưng không quá nhiều. Nó có lẽ đáng để đầu tư, và mã của bạn sẽ không phải là nền tảng cụ thể.
- 1. Phân biệt giữa các thư mục và tệp trong C++
- 2. Sự khác biệt giữa thư viện chuẩn C và thư viện C POSIX
- 3. Sự khác biệt giữa _ và tự. trong Mục tiêu-C
- 4. Xóa đệ quy các tệp và thư mục trong C#
- 5. Sự khác biệt giữa C++, mục tiêu-c và mục tiêu-C++ là gì?
- 6. Sự khác biệt giữa Gói và Thư mục trong Java
- 7. Sự khác biệt giữa mục tiêu-c và java
- 8. Mục tiêu-C: sự khác biệt giữa id và void *
- 9. sự khác biệt giữa các tệp tiêu đề c (.h) và tệp tiêu đề C++ (.hpp)
- 10. Sự khác biệt giữa cấu trúc trong C và C++
- 11. C++ - Sự khác biệt giữa (*). và ->?
- 12. Thư viện xem thư mục/tệp trong C/C++
- 13. Xóa một thư mục và các thư mục con của nó trong Mục tiêu-C/C
- 14. sự khác biệt giữa popen() và hệ thống() trong C
- 15. C# Tệp/Thư mục Quyền
- 16. sự khác biệt giữa "ifndef" và "if! Defined" trong C?
- 17. Unix: Sự khác biệt giữa nguồn và xuất là gì?
- 18. Sự khác biệt giữa các lớp C# một phần và các mục tiêu C?
- 19. Nén và giải nén thư mục trong C#
- 20. Cách phân biệt giữa hình ảnh nội tuyến và tệp đính kèm trong triển vọng 2010 [C#]
- 21. C/C++: Sự khác biệt giữa thư viện liên kết tĩnh và tệp đối tượng là gì?
- 22. Sự khác biệt giữa "cuộc gọi hệ thống C" và "thói quen thư viện C" là gì?
- 23. Khác biệt giữa hai cây thư mục để tạo bản vá mức tệp/thư mục (bao gồm tệp nhị phân)
- 24. Đổi tên tệp trong thư mục C#
- 25. Sự khác biệt giữa "var" và "đối tượng" trong C#
- 26. Sự khác biệt giữa dài và int trong C#?
- 27. khác biệt giữa phát hành và dealloc trong Objective-C
- 28. Sự khác biệt giữa char và ký char trong C++?
- 29. Sự khác biệt giữa & (dấu và) và && hoặc | (ống) và || trong Objective-C?
- 30. C - Sự khác biệt giữa "char var []" và "char * var"?
mã của bạn hơi cồng kềnh do kiểm tra lỗi. Tôi đề nghị loại bỏ điều này và thêm một số nhận xét như "kiểm tra lỗi: tệp không tồn tại, không đủ đối số". Tôi nghĩ rằng nó sẽ làm cho câu trả lời của bạn tốt hơn một chút –
Tôi thích nó với kiểm tra lỗi, vì đó thường là trái ra khỏi các ví dụ và mọi người không nhất thiết phải biết làm thế nào để đưa nó trở lại. –
Tôi đã bỏ nó vào, nhưng làm rõ trong văn bản những gì các bit quan trọng là. – paxdiablo