mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
lavf: Use MoveFileEx instead of rename/_wrename on windows
This allows getting the normal unix semantics, where a rename allows replacing an existing file. Based on a suggestion by Reimar Döffinger. Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
parent
9326d64ed1
commit
79fd186a50
2
configure
vendored
2
configure
vendored
@ -1466,6 +1466,7 @@ SYSTEM_FUNCS="
|
||||
localtime_r
|
||||
mach_absolute_time
|
||||
MapViewOfFile
|
||||
MoveFileExA
|
||||
memalign
|
||||
mkstemp
|
||||
mmap
|
||||
@ -4096,6 +4097,7 @@ check_func_headers windows.h GetProcessAffinityMask
|
||||
check_func_headers windows.h GetProcessTimes
|
||||
check_func_headers windows.h GetSystemTimeAsFileTime
|
||||
check_func_headers windows.h MapViewOfFile
|
||||
check_func_headers windows.h MoveFileExA
|
||||
check_func_headers windows.h SetConsoleTextAttribute
|
||||
check_func_headers windows.h Sleep
|
||||
check_func_headers windows.h VirtualAlloc
|
||||
|
@ -170,14 +170,31 @@ static inline int win32_rename(const char *src_utf8, const char *dest_utf8)
|
||||
goto fallback;
|
||||
}
|
||||
|
||||
ret = _wrename(src_w, dest_w);
|
||||
ret = MoveFileExW(src_w, dest_w, MOVEFILE_REPLACE_EXISTING);
|
||||
av_free(src_w);
|
||||
av_free(dest_w);
|
||||
// Lacking proper mapping from GetLastError() error codes to errno codes
|
||||
if (ret)
|
||||
errno = EPERM;
|
||||
return ret;
|
||||
|
||||
fallback:
|
||||
/* filename may be be in CP_ACP */
|
||||
return rename(src_utf8, dest_utf8);
|
||||
#if HAVE_MOVEFILEEXA
|
||||
ret = MoveFileExA(src_utf8, dest_utf8, MOVEFILE_REPLACE_EXISTING);
|
||||
if (ret)
|
||||
errno = EPERM;
|
||||
#else
|
||||
/* Windows Phone doesn't have MoveFileExA. However, it's unlikely
|
||||
* that anybody would input filenames in CP_ACP there, so this
|
||||
* fallback is kept mostly for completeness. Alternatively we could
|
||||
* do MultiByteToWideChar(CP_ACP) and use MoveFileExW, but doing
|
||||
* explicit conversions with CP_ACP is allegedly forbidden in windows
|
||||
* store apps (or windows phone), and the notion of a native code page
|
||||
* doesn't make much sense there. */
|
||||
ret = rename(src_utf8, dest_utf8);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define mkdir(a, b) win32_mkdir(a)
|
||||
|
Loading…
Reference in New Issue
Block a user