2010-03-02 60 views
8

我做了一個簡單的函數,它獲得了一個文件的大小。如何獲得大於4 Gb的文件大小?

int file_size(char * filename) 
{ 
    int size; 
    struct stat st; 

    stat(filename, &st); 
    size = st.st_size; 

    return size; 

}//file_size 

它工作正常,但如果我有一個文件,該文件的大小大於4GB的比我得到一個是負面的多少回了,當然這是不正確的文件大小。那麼我怎麼能得到這樣一個大文件的大小?我認爲,返回值應該像int一樣,但我不知道是什麼,我不認爲這會解決我的問題。

感謝,

kampi

更新:

嗨!

我找到了解決方案。我必須使用__stat64。我修改了我的功能,現在它正在檢索實際大小。我用一個8Gb的大文件測試了它。

unsigned long long int file_size(char * filename) 
{ 
    unsigned long long int size; 
    struct __stat64 st; 

    __stat64(filename, &st); 
    size = st.st_size; 

    return size; 

}//file_size 

以及通知:

,當我用printf的,我不得不使用 「%I64d的」 打印出來。

+0

如果將'int'更改爲'off_t',或者如果不可用'size_t',該怎麼辦?在返回類型和'size'聲明中。 – 2010-03-02 07:07:06

回答

3

您可以使用_stat64

+0

非常感謝,這是解決我的問題最簡單的方法。 – kampi 2010-03-02 09:32:32

5

您可以使用Win32 GetFileSizeEx函數。

HANDLE aFile = CreateFile 
(
    filename, 
    FILE_READ_ATTRIBUTES, 
    0, 
    NULL, 
    OPEN_EXISTING, 
    FILE_ATTRIBUTE_NORMAL, 
    NULL 
); 

if (aFile != INVALID_HANDLE_VALUE) 
{ 
    long long aSize; 
    GetFileSizeEx(aFile, &aSize); 

    CloseHandle(aFile); 
    return aSize; 
} 
else 
    return -1; 
+0

唯一需要注意的可能是(不太確定),在同一個進程中混合和匹配posix調用與win32調用可能很困難。它看起來像OP可能來自unix背景,並且只想使用posix調用。 – 2010-03-02 14:57:29

0

我認爲,問題是因爲文件的大小超過INT_MAX更多的,因此,它是給你 負值。

也許你可以對長數據類型進行類型轉換,它可能工作。

否則使用,fseek,ftell函數。然後從開始文件指針中減去結束文件指針。它也會給你文件大小。 (字節數)。

1

st_size是隻要定義的wchar.h,所以你很可能與嘗試,而不是INT

struct stat { 
    .... 
    _off_t  st_size; 
    .... 
} 

.... 

typedef long _off_t; 

,可能是這樣的

long file_size(char * filename) 
{ 
    long size; 
    struct stat st; 

    stat(filename, &st); 
    size = st.st_size; 

    return size; 

}//file_size 
+1

沒有理由不能將「無符號」前置,因爲文件大小不可能是負數。 – 2010-03-02 07:19:02

+2

如果截斷髮生在st.st_size中,我很好奇如何將它分配給long有助於這種情況。 – Arun 2010-03-02 07:34:49

3

在這種情況下,返回值stat()可能爲-1,並且errno設置爲EOVERFLOW

stat我的(64位x86機器)上的手冊頁說:

EOVERFLOW

(STAT())路徑是指其 大小不能在類型 表示的文件off_t。如果在32位 平臺上編譯的 應用程序在沒有調用 -D_FILE_OFFSET_BITS = 64的平臺上調用大小超過(2 < < 31)-1 位的文件的stat(),則會發生這種情況。

相關問題