【发布时间】:2013-08-20 19:22:39
【问题描述】:
我们的服务日志文件之一映射到内存。我有另一个应用程序跟踪日志文件上的一些正则表达式,所以我需要定期获取日志文件大小并读取即将到来的行(如果有)。我通过 ftell() 检查日志文件大小以获取以字节为单位的大小,但是它返回 4mb,因为我猜它被映射到 4mb。
我可以使用 C 或 C++。我的逻辑如下:
FILE *f = fopen("logfile.log", "r")
// go to file end to get current end position
fseek(f, 0, SEEK_END)
// ftell() always returns 4mb when actual file size is less than 4mb
// I need to get exact size of log file
currentEnd = ftell(f)
// go last read position
fseek(f, previousEnd, SEEK_SET)
//read from previousEnd to currentEnd with fread
// update last read position
previousEnd = currentEnd
有没有办法在 Windows 上获取现有映射文件的确切大小(以字节为单位)? 任何建议和想法表示赞赏。谢谢。
【问题讨论】:
-
GetFileSizeEx() 说什么?
-
嗨 Medinoc,不幸的是,结果又是 4mb,它也没有说确切的当前实际大小。
-
文件应该大于还是小于 4mb?如果是后者,我几乎没有希望(如果它映射到 4mb,那么它被认为至少有 4mb 长)。如果是前者,我也没有什么希望,因为 GetFileSizeEx 等应该工作......
-
它以 4mb 大小开始,即使它只有一行,过了一会儿,随着行的到来,它超过了 4mb。所以我可以说它被认为至少有 4mb 长。
-
我认为您没有正确使用术语“内存映射文件”。这看起来根本不像内存映射文件,它看起来像一个名为
logfile.log的常规文件。您正在使用沼泽标准fopen函数打开它。内存映射文件不仅仅是您为 I/O 打开的文件。
标签: c++ c windows memory-mapped-files