如何在Windows上搜索超过4GB的文件?

时间:2012-02-23 01:07:31

标签: c++ large-files unsigned-long-long-int

我在Windows 7,64位和NTFS上。 我正在构建一个必须是32位的DLL。我有一个非常简单的例程,我想在C ++中实现。我正在使用以下方式阅读大文件:

unsigned long p;
ifstream source(file);
streampos pp(p);
source.seekg(pp);

对于超过4GB的文件,我尝试使用unsigned long long,但它不起作用。 我究竟做错了什么?我正在使用GNU GCC,试用MSVC Express 2008/2010会有什么用处吗?

更新

我的海湾合作委员会似乎有问题。现在我正在使用MSVC测试您的提案,它似乎正在运行。 MSVC使用_int64来表示streampos / streamoff对象,稍后我将与GCC一起检查。

3 个答案:

答案 0 :(得分:2)

如果你在32位系统上运行,你可能会以简单的方式做到这一点,尽管流库可以为其pos_type免费使用64位字。但是,它可能有助于使用相对寻求。由于所有的搜索都会返回pos_type,这可能表示当前的位置,但这仍然可能效果不佳。

我想这只是我,但我从来没有找到寻求过于有用的东西。当然,实现了这个混乱之后,我也意识到搜索必然会破坏性能,而且只有在使用std::ios_base::binary模式下打开且不使用代码转换的文件时才能正常工作。

答案 1 :(得分:1)

您可能必须使用多个相对搜索,即使用seekg的双参数重载。

// Start with seeking from the beginning
source.seekg(some_pos, std::ios::beg);

// Then seek some more from that position
source.seekg(some_offset, std::ios::cur);

答案 2 :(得分:1)

我相信您必须使用原生Win32调用来执行此操作,例如SetFilePointerEx http://msdn.microsoft.com/en-us/library/aa365542(VS.85).aspx