gpt4 book ai didi

c++ - 在 Windows 上打开并获取现有内存映射文件的确切大小

转载 作者:行者123 更新时间:2023-11-30 17:48:49 25 4
gpt4 key购买 nike

我们的服务日志文件之一映射到内存。我有另一个应用程序跟踪日志文件上的某些正则表达式,因此我需要定期获取日志文件大小并读取接下来的行(如果有)。我通过 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 上获取现有映射文件的确切大小(以字节为单位)? 任何建议和想法表示赞赏。谢谢。

最佳答案

没办法,因为你错了。一旦您映射 4mb 的文件,系统就会将文件大小调整为 4mb。这很容易检查:

HANDLE file = CreateFile(_T("1.txt"), GENERIC_READ | GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
HANDLE mapping = CreateFileMapping(file, 0, PAGE_READWRITE, 0, 4*1024*1024, 0);
void* view = MapViewOfFile(mapping, FILE_MAP_WRITE, 0, 0, 0);

运行此代码并关闭程序(为了清楚起见,省略了清理)。您将看到该文件现在有 4mb。显然,你不可能获得任何类型的“位置”,因为根本不存在。

我相信问题的根源是您首先想要映射日志文件。不仅会遇到位置问题,当日志大小超过 4mb 时还会遇到另一个问题。为什么不像往常一样写入日志文件?

关于c++ - 在 Windows 上打开并获取现有内存映射文件的确切大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18330455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com