2015-08-30 20 views
2

問題:有沒有獲得一個文件的大小爲off_t絕對文件路徑時,文件路徑相對到當前的工作目錄是不知道手段c - 從中​​絕對路徑的文件的大小

這很可能被標記爲重複,但我相信它從諸如thisthis這樣的問題中充分變化,因爲我不想使用相對路徑。

像許多民間-IT appears-我掉進假設希望獲得文件信息stat()時使用相對(當前工作目錄)的路徑名絕對而非的陷阱。我有一個文件的絕對路徑,我需要確定off_t的大小。我發現的第二個問題是,絕對路徑名稱(除了指向錯誤的地方)也可能從limits.h?以上超過PATH_MAX

下面找到的函數here提供了一種獲取具有相對路徑的off_t的方法。但顯然這將通過errno以絕對路徑返回No such file or directory,因爲它使用了stat()

#include <sys/stat.h> 
#include <string.h> 
#include <stdio.h> 
#include <errno.h> 

off_t fsize(const char *filename) { 
    struct stat st; 

    if (stat(filename, &st) == 0) 
     return st.st_size; 

    fprintf(stderr, "Cannot determine size of %s: %s\n", 
      filename, strerror(errno)); 

    return -1; 
} 

因爲我知道有人會問;我被告知chdir()既不是線程安全的也不是好的做法;我應該避免改變當前的工作目錄。我也建議避開fseek()但沒有給出爲何理由..

+7

而......你在問什麼? 'stat()'確實可以用絕對路徑工作! – 3442

+0

用'chdir()'設置的當前目錄就像一個全局變量,在線程之間共享並影響所有使用路徑名的線程的系統調用。出於這個原因,我同意你應該在程序啓動之前初始化一次,然後再產生線程。 'fseek()':我同意你不應該在沒有必要的時候使用它(並且使用它是很少合理的)。並非所有類型的流支持尋求!通過不使用查找操作,您的流用戶代碼變得更加通用,並且可以用於更多種類的流。例如,套接字是不可查找的流。 – pasztorpisti

+1

啊......我非常困惑。 – Chortle

回答

1

stat(2)允許你使用它從根目錄全路徑名(如果該路徑以/開始),或指定一個文件從當前目錄中選擇相關的一個(否則,請參閱path_resolution(7))。即使您不知道任何名稱(如果您只有一個打開的文件描述符,並且您不知道此文件的名稱),您也可能會進行系統調用fstat(2)

請注意文件大小可能會在stat(2)致電您知道文件大小和您可以執行的任何操作之間發生變化。如果你想確保你的寫作不會與其他人發生衝突,請考慮打開O_APPEND國旗。

+0

好的編輯Basile,對path_resolution的引用是完成這個答案的最佳補充。感謝編輯。 –

+0

雖然我的問題很差,但這對於理解'stat()'和'fstat()'是最有幫助的,最後我最終使用了它。 – Chortle

+0

@Chortle,還有另一種使用'lseek(2)'獲取文件大小的方法,但是它的缺點是需要一個打開的文件描述符(而不是你在問題中請求的路徑名),所以我沒有提到它。 –