Существует один из наших файлов журнала услуг, который отображается в памяти. У меня есть другое приложение, отслеживающее некоторое регулярное выражение в файле журнала, поэтому мне нужно периодически получать размер файла журнала и читать строки, если они есть. Я проверяю размер файла журнала с помощью ftell (), чтобы получить размер в байтах, однако он возвращает 4 МБ, так как он сопоставлен с 4 МБ.
Я могу использовать 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
Есть ли способ получить точный размер существующих отображаемых файлов в байтах на окнах?
Любое предложение и идея приветствуется. Благодарю.
Нет пути, потому что ты не прав. Как только вы отобразите 4 МБ файла, система изменит размер файла до 4 МБ. Это легко проверить:
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. Ясно, что вы никак не можете получить какую-либо «позицию», поскольку ее нет.
Я считаю, что корень проблемы заключается в вашем желании сопоставить файл журнала в первую очередь. Не только у вас возникают проблемы с положением, у вас также есть другая проблема, когда размер журнала превышает 4 МБ. Почему вы просто не записали в файл журнала как обычно?
Других решений пока нет …