2012-09-21 79 views
3

我瘋了,試圖讓它在MinGW 32位上運行。它適用於我嘗試過的所有其他平臺。在MinGW 32-bit上確定64位文件大小C使用MinGW 32位

我想要做的就是將大於4GB的文件變成64位的整數。

能正常工作在其他平臺上:

#define _FILE_OFFSET_BITS 64 
#include <sys/stat.h> 

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

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

    return -1; 
} 

我想上面的代碼之前添加以下定義的基礎上,我在網上找到各種建議:

#define _LARGEFILE_SOURCE 1 
#define _LARGEFILE64_SOURCE 1 
#define __USE_LARGEFILE64 1 

也試過:

#ifdef __MINGW32__ 
#define off_t off64_t 
#endif 

最後嘗試添加-D_FILE_OFFSET_BITS = 64到gcc標誌(應該是sam e,因爲上面的定義雖然...)

沒有運氣。返回的int64_t仍然被截斷爲一個32位值。

在MinGW 32位中確定64位文件大小的正確方法是什麼?

謝謝!

回答

2

謝謝你們,好建議,但我想通了...... MinGW的要求這個定義,使結構__stat64和功能_stat64:

#if __MINGW32__ 
#define __MSVCRT_VERSION__ 0x0601 
#endif 

然後這個工程:

int64_t fsize(const char *filename) { 

#if __MINGW32__ 
    struct __stat64 st; 
    if (_stat64(filename, &st) == 0) 
#else 
    struct stat st; 
    if (stat(filename, &st) == 0) 
#endif 

     return st.st_size; 

    return -1; 
} 

希望這有助於某人。

0

您可以嘗試lseek64如果在MinGW的包

#define _LARGEFILE64_SOURCE  /* See feature_test_macros(7) */ 
    #include <sys/types.h> 
    #include <unistd.h> 

    off64_t lseek64(int fd, off64_t offset, int whence); 
3

我沒有MinGW的方便,現在存在,但如果我沒有記錯有一個_stat64功能什麼使用struct __stat64。你可能想用一些狡猾的宏來隱藏這個醜陋!

+0

可能不需要太狡猾 - 只需在'fsize()'函數中使用'#if _WIN32 /#else /#endif'。 –

+0

請參閱http://msdn.microsoft.com/en-us/library/14h5k7ff.aspx – Christoph

+0

@MichaelBurr只要'fsize()'是他/她使用'stat'的唯一地方。 (當我輸入狡猾的語言時,我的舌頭緊緊地貼在我的臉頰上!) – idz