attempt to reset create on Windows
When writing a file on Windows, you need to set the create date or the date might be copied over from a previous file of the same name. Quick hack, might be enough to fix this. See https://github.com/jcupitt/libvips/issues/729
This commit is contained in:
parent
739389d18d
commit
0911b4a282
@ -543,6 +543,29 @@ vips__write( int fd, const void *buf, size_t count )
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
#ifdef OS_WIN32
|
||||
/* Deletes and resets the create date on the named file. This is necessary on
|
||||
* Windows, or the create date may be copied over from an existing file of the
|
||||
* same name.
|
||||
*
|
||||
* See https://blogs.msdn.microsoft.com/oldnewthing/20050715-14/?p=34923
|
||||
*/
|
||||
int
|
||||
vips__delete_create( const char *path16 )
|
||||
{
|
||||
HANDLE handle;
|
||||
|
||||
/* Even though we're only writing, ask for read as well to
|
||||
* speed up operation over network shares.
|
||||
*/
|
||||
handle = CreateFileW( path16, GENERIC_READ | GENERIC_WRITE,
|
||||
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
|
||||
|
||||
if( handle != INVALID_HANDLE_VALUE )
|
||||
CloseHandle( handle );
|
||||
}
|
||||
#endif /*OS_WIN32*/
|
||||
|
||||
/* open() with a utf8 filename, setting errno.
|
||||
*/
|
||||
int
|
||||
@ -566,6 +589,9 @@ vips__open( const char *filename, int flags, ... )
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
if( mode & O_CREAT )
|
||||
vips__delete_create( path16 );
|
||||
|
||||
fd = _wopen( path16, flags, mode );
|
||||
|
||||
g_free( path16 );
|
||||
@ -606,6 +632,9 @@ vips__fopen( const char *filename, const char *mode )
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
if( mode[0] == 'w' )
|
||||
vips__delete_create( path16 );
|
||||
|
||||
fp = _wfopen( path16, mode16 );
|
||||
|
||||
g_free( path16 );
|
||||
|
Loading…
Reference in New Issue
Block a user