Eryk Sun <[email protected]> added the comment:
The resize() method also modifies the file pointer. Instead of fixing that
oversight, I think it should directly set the file's FileEndOfFileInfo and
FileAllocationInfo. For example:
// resize the file
if (!SetFileInformationByHandle(
self->file_handle, FileEndOfFileInfo,
&max_size, sizeof(max_size)) ||
!SetFileInformationByHandle(
self->file_handle, FileAllocationInfo,
&max_size, sizeof(max_size)))
{
// resizing failed. try to remap the file
file_resize_error = GetLastError();
max_size.QuadPart = self->size;
new_size = self->size;
}
This is cheaper in terms of system calls. The existing implementation makes
four system calls: one to set the file pointer in SetFilePointerEx() and three
in SetEndOfFile(), which queries the file pointer, sets the end-of-file info,
and sets the allocation info.
Note that this approach doesn't modify the file pointer in any case. This may
be surprising if the file size shrinks to less than the existing file pointer.
But os.ftruncate() behaves the same way, as does the resize() method in Linux.
----------
nosy: +eryksun
versions: -Python 3.7, Python 3.8
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue46858>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com