Alistair Leslie-Hughes leslie_alistair@hotmail.com writes:
- if (flags & COPY_FILE_OPEN_SOURCE_FOR_WRITE)
source_access |= GENERIC_WRITE;- if ((h1 = CreateFileW( source, source_access, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, 0 )) == INVALID_HANDLE_VALUE)
This looks like an unrelated change.
@@ -552,7 +565,11 @@ BOOL WINAPI CopyFileExW( const WCHAR *source, const WCHAR *dest, LPPROGRESS_ROUT } }
- if ((h2 = CreateFileW( dest, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
- if ((h2 = CreateFileW( dest, GENERIC_WRITE | DELETE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
(flags & COPY_FILE_FAIL_IF_EXISTS) ? CREATE_NEW : CREATE_ALWAYS,info.FileAttributes, h1 )) == INVALID_HANDLE_VALUE &&/* retry without DELETE if we got a sharing violation */(h2 = CreateFileW( dest, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, (flags & COPY_FILE_FAIL_IF_EXISTS) ? CREATE_NEW : CREATE_ALWAYS, info.FileAttributes, h1 )) == INVALID_HANDLE_VALUE)
Same here.
@@ -562,6 +579,29 @@ BOOL WINAPI CopyFileExW( const WCHAR *source, const WCHAR *dest, LPPROGRESS_ROUT return FALSE; }
- size = info.EndOfFile;
- transferred.QuadPart = 0;
- if (progress)
- {
cbret = progress( size, transferred, size, transferred, 1,CALLBACK_STREAM_SWITCH, h1, h2, param );if (cbret == PROGRESS_QUIET)progress = NULL;else if (cbret == PROGRESS_STOP){SetLastError( ERROR_REQUEST_ABORTED );goto done;}else if (cbret == PROGRESS_CANCEL){BOOLEAN disp = TRUE;SetFileInformationByHandle( h2, FileDispositionInfo, &disp, sizeof(disp) );SetLastError( ERROR_REQUEST_ABORTED );goto done;}- }
- while (ReadFile( h1, buffer, buffer_size, &count, NULL ) && count) { char *p = buffer;
@@ -571,13 +611,38 @@ BOOL WINAPI CopyFileExW( const WCHAR *source, const WCHAR *dest, LPPROGRESS_ROUT if (!WriteFile( h2, p, count, &res, NULL ) || !res) goto done; p += res; count -= res;
if (progress){transferred.QuadPart += res;cbret = progress( size, transferred, size, transferred, 1,CALLBACK_CHUNK_FINISHED, h1, h2, param );if (cbret == PROGRESS_QUIET)progress = NULL;else if (cbret == PROGRESS_STOP){SetLastError( ERROR_REQUEST_ABORTED );goto done;}else if (cbret == PROGRESS_CANCEL){BOOLEAN disp = TRUE;SetFileInformationByHandle( h2, FileDispositionInfo, &disp, sizeof(disp) );SetLastError( ERROR_REQUEST_ABORTED );goto done;}}
Surely there's a way to avoid duplicating this code.