2010-08-18 77 views
8

我想弄清楚如何使用stat()捕獲有關文件的信息。我需要的是能夠打印關於文件的幾個信息字段。所以..使用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; 
    ... 
} 

我對如何做到這一點感到非常困惑。爲什麼& buf參數stat?我不在乎將這些信息存儲在內存中,我只需要在我的C++程序中輸出的字段。我如何訪問結構中包含的信息? buf是否應該包含stat()返回的信息?

+0

我看解釋好,三江源所有答案。他們相當有幫助。有誰知道如何使用stdin,stdout或stderr作爲統計工作的參數嗎?這些是流而不是文件,那麼stat如何用數據填充結構? – 2010-08-18 13:33:39

+0

使用'fstat',它將文件描述符作爲其第一個參數而不是路徑。 – 2010-08-18 13:41:10

+0

通常我會這樣做,但環境有點人爲,因爲這是我寫的建築模擬器的操作系統部分。所以當一個文件被系統調用打開時,我有自己的向量來充當文件描述符表。打開文件時,是否有一種很好的方法來捕獲計算機上實際的文件描述符?如果是這樣的話,我會使用fstat,因爲在流統計和文件統計之間不需要翻譯。 – 2010-08-18 13:48:24

回答

11

是的,buf在這裏被用作外部參數。結果存儲在buf中,並且返回值stat是指示stat操作是成功還是失敗的錯誤代碼。

這樣做是因爲stat是一個POSIX函數,專爲C語言設計,它不支持異常等帶外錯誤報告機制。如果stat返回一個結構,那麼它將無法指示錯誤。使用這種外出參數方法還允許呼叫者選擇他們想要存儲結果的位置,但這是次要特徵。傳遞正常局部變量的地址是完全正確的,就像你在這裏完成的一樣。

您像訪問任何其他對象一樣訪問結構的字段。我認爲你至少熟悉對象符號?例如。 結構的stat結構中的st_dev字段由buf.st_dev訪問。所以:

cout << buf.st_dev << endl; 

2

你在你的代碼的幾個錯誤:

  • 你需要&buf,用一個單一的 'F'。
  • 您需要說打印時爲buf.st_dev,因爲st_dev是結構變量中的一個字段。

由於buf是堆棧中的局部變量,因此您不是永久性地將值保存到內存中,只要該變量處於範圍內即可。

這就是你如何返回多個值,通常在C和C++中。你傳遞一個指向結構的指針,被調用的函數用它爲你計算的值填充結構。

1

buf是STAT負荷約在第一個參數傳遞的文件中的信息結構。您在這裏通過&buf b/c您將buf作爲局部變量分配在堆棧上,您必須將指針傳遞給stat函數才能使其加載數據。

st_*所有變量是結構統計對象的一部分,因此必須通過當地buf變量buf.st_uid

3

另一個項目來訪問,我已經掀起了一個小功能,做類似的東西到你需要的東西。看看sprintstatf

下面是使用的例子:

#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

這個問題可以解釋爲老發表評論,但我張貼此作爲參考

要獲取有關統計有很好的理解()函數中,原因是經過統計的參考,更重要的錯誤處理在以下鏈接

stat - get file status