在windows上打开并获取现有内存映射文件的确切大小
open and get exact size of existing memory mapped file on windows
有一个服务日志文件映射到内存。我有另一个应用程序在跟踪日志文件上的一些正则表达式,所以我需要定期获取日志文件的大小,并读取即将到来的行(如果有的话)。我通过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时,您不仅会遇到位置问题,还会遇到另一个问题。为什么不像往常一样直接写入日志文件?
相关文章:
- GCC链接器 - 将存档中的所有对象文件映射到特定部分
- 为什么我无法使用文本文件创建文件映射?
- 如何通过文件映射对象重新映射共享内存的视图?
- 共享数据文件映射
- 频繁访问文件映射内存
- 如何在Windows和更高版本上保留内存,并将文件映射到内存中
- 文件映射对象和文件对象可以互换使用吗
- 如何在C++中创建文件映射
- 使用文件映射从文件中读取数据
- 打开文件映射问题,找不到文件映射
- 将几个大文件映射到内存
- 文件映射和文件结构
- Windows CreateFileMapping:具有相同支持文件的不同文件映射对象
- 文件映射IPC挂起MapViewOfFile调用
- 使用C++中的文件映射对象进行读取
- 如何正确使用文件映射并将数据传递给子进程
- 文件映射打开(Windows)
- 循环文件映射会降低性能
- 内存映射文件-映射结构而不是文件
- 将一个文件映射到内存,然后获取到该内存的文件描述符