2009-06-24 39 views

Trả lời

35

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 
+0

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 –

+3

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. –

+1

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

9

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.

-1

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 ..

+2

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

+3

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. –

5

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ể.

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