2010-08-18 30 views
8

Tôi đang cố gắng tìm hiểu chính xác cách sử dụng stat() để nắm bắt thông tin về một tệp. Những gì tôi cần là để có thể in một số lĩnh vực thông tin về một tập tin. Vì vậy ..Sử dụng Struct Stat()

#include <iostream> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
using namespace std; 

int main() { 
    struct stat buf; 
    stat("file",&buf); 
       ... 
    cout << st_dev << endl; 
    cout << st_ino << endl; 
    cout << st_mode << endl; 
    cout << st_nlink << endl; 
    cout << st_uid << endl; 
    cout << st_gid << endl; 
    cout << st_rdev << endl; 
    cout << st_size << endl; 
    cout << st_blksize << endl; 
    cout << st_blocks << endl; 
    cout << st_atime << endl; 
    cout << st_mtime << endl; 
    cout << st_ctime << endl; 
    ... 
} 

Tôi hoàn toàn nhầm lẫn về cách thực hiện việc này. Tại sao là & buf một tham số cho stat? Tôi không quan tâm đến việc lưu trữ thông tin này trong bộ nhớ, tôi chỉ cần các trường được xuất ra trong chương trình C++ của tôi. Làm cách nào để truy cập thông tin có trong cấu trúc? Là buf thực sự phải chứa thông tin trả về từ stat()?

+0

Tôi hiểu, cảm ơn tất cả vì những câu trả lời. Họ khá hữu ích. Có ai biết làm thế nào bằng cách sử dụng stdin, stdout, hoặc stderr như các tham số để stat hoạt động? Đây là những luồng và không phải là các tệp sao cho stat có thể tạo một cấu trúc với dữ liệu? –

+0

Sử dụng 'fstat', sẽ lấy một bộ mô tả tập tin làm đối số đầu tiên thay vì một đường dẫn. –

+0

Thông thường tôi sẽ làm điều này nhưng môi trường có phần nhân tạo vì đây là phần hệ điều hành của một bộ mô phỏng kiến ​​trúc mà tôi đã viết. Vì vậy, khi một tập tin được mở bởi một syscall, tôi có vector của riêng tôi để hoạt động như một bảng mô tả tập tin. Có cách nào tốt để nắm bắt các mô tả tập tin thực tế trên máy cho một tập tin khi nó được mở? Nếu đó là trường hợp tôi sẽ sử dụng fstat vì không có bản dịch nào được yêu cầu giữa thống kê luồng và số liệu thống kê tệp. –

Trả lời

11

Có, buf đang được sử dụng ở đây làm tham số ngoài. Kết quả được lưu trữ trong buf và giá trị trả lại là stat là mã lỗi cho biết hoạt động stat đã thành công hay không thành công.

Nó được thực hiện theo cách này bởi vì stat là một hàm POSIX, được thiết kế cho C, không hỗ trợ các cơ chế báo cáo lỗi ngoài băng như ngoại lệ. Nếu stattrả về một cấu trúc, thì sẽ không có cách nào để chỉ ra lỗi. Sử dụng phương pháp tham số ngoài này cũng cho phép người gọi chọn nơi họ muốn lưu trữ kết quả, nhưng đó là một tính năng phụ. Nó hoàn toàn tốt đẹp để vượt qua địa chỉ của một biến cục bộ bình thường, giống như bạn đã làm ở đây.

Bạn truy cập vào các trường của cấu trúc giống như bạn làm với bất kỳ đối tượng nào khác. Tôi đoán bạn ít nhất là familar với ký hiệu đối tượng? Ví dụ. trường st_dev trong cấu trúc stat được gọi là buf được truy cập bởi buf.st_dev. Vì vậy:

cout << buf.st_dev << endl; 

, vv

2

Bạn có một vài lỗi trong mã của bạn:

  • Bạn cần &buf, với một đĩa đơn 'f'.
  • Bạn cần phải nói ví dụ: buf.st_dev khi in, vì st_dev là một trường trong biến cấu trúc.

buf là biến cục bộ trên ngăn xếp, bạn không "lưu giá trị vào bộ nhớ" vĩnh viễn, chỉ miễn là biến đó nằm trong phạm vi.

Đây là cách bạn trả về nhiều giá trị, thông thường, trong C và C++. Bạn chuyển một con trỏ tới một cấu trúc và hàm được gọi là điền vào trong cấu trúc với các giá trị mà nó đã tính cho bạn.

1

buf là cấu trúc mà stat tải với các thông tin về các tập tin bạn vượt qua trong tham số đầu tiên. Bạn vượt qua &buf tại đây b/c bạn có buf được cấp phát trên ngăn xếp dưới dạng biến cục bộ và bạn phải chuyển con trỏ tới hàm stat để cho phép nó tải dữ liệu.

Tất cả các biến của st_* là một phần của đối tượng struct stat và do đó phải được truy cập thông qua biến buf địa phương của bạn như buf.st_uid vv

3

Đối với một dự án khác, tôi đã whipped lên một chức năng nhỏ mà làm điều gì đó tương tự với những gì bạn cần. Hãy xem sprintstatf.

Dưới đây là một ví dụ về việc sử dụng:

#include <sys/stat.h> 
#include <stdlib.h> 
#include <stdio.h> 

#include "sprintstatf.h" 

int 
main(int argc, char *argv[]) 
{ 
    char *outbuf = (char *)malloc(2048 * sizeof(char)); 
    struct stat stbuf; 
    char *fmt = \ 
     "st_atime (decimal) = \"%a\"\n" 
     "st_atime (string) = \"%A\"\n" 
     "st_ctime (decimal) = \"%c\"\n" 
     "st_ctime (string) = \"%C\"\n" 
     "st_gid (decimal) = \"%g\"\n" 
     "st_gid (string) = \"%G\"\n" 
     "st_ino    = \"%i\"\n" 
     "st_mtime (decimal) = \"%m\"\n" 
     "st_mtime (string) = \"%M\"\n" 
     "st_nlink   = \"%n\"\n" 
     "st_mode (octal) = \"%p\"\n" 
     "st_mode (string) = \"%P\"\n" 
     "st_size   = \"%s\"\n" 
     "st_uid    = \"%u\"\n" 
     "st_uid    = \"%U\"\n"; 

    lstat(argv[1], &stbuf); 

    sprintstatf(outbuf, fmt, &stbuf); 
    printf("%s", outbuf); 

    free(outbuf); 
    exit(EXIT_SUCCESS); 
} 

/* EOF */ 
1

Câu hỏi này có thể là cách để cũ để bình luận, nhưng tôi gửi bài này như một tài liệu tham khảo

Để có được một sự hiểu biết tốt về stat() chức năng, các lý do để chuyển tham chiếu stat và quan trọng hơn là việc xử lý lỗi được giải thích tốt trong liên kết bên dưới

stat - get file status

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