2010-03-02 76 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(),则会发生这种情况。

相关问题