The copy_file() function now accepts an optional callback function.
This commit is contained in:
parent
dfc1cc97cc
commit
f98b28b510
@ -105,7 +105,8 @@ namespace MUtils
|
|||||||
MUTILS_API const ArgumentMap &arguments(void);
|
MUTILS_API const ArgumentMap &arguments(void);
|
||||||
|
|
||||||
//Copy file
|
//Copy file
|
||||||
MUTILS_API bool copy_file(const QString &sourcePath, const QString &outputPath, const bool &overwrite = true);
|
typedef bool (*progress_callback_t)(const double &progress, void *const userData);
|
||||||
|
MUTILS_API bool copy_file(const QString &sourcePath, const QString &outputPath, const bool &overwrite = true, const progress_callback_t callback = NULL, void *const userData = NULL);
|
||||||
|
|
||||||
//Get the OS version
|
//Get the OS version
|
||||||
MUTILS_API const Version::os_version_t &os_version(void);
|
MUTILS_API const Version::os_version_t &os_version(void);
|
||||||
|
@ -137,15 +137,41 @@ const MUtils::OS::ArgumentMap &MUtils::OS::arguments(void)
|
|||||||
// COPY FILE
|
// COPY FILE
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
MUTILS_API bool MUtils::OS::copy_file(const QString &sourcePath, const QString &outputPath, const bool &overwrite)
|
typedef struct _progress_callback_data_t
|
||||||
{
|
{
|
||||||
const BOOL result = CopyFileW(MUTILS_WCHR(QDir::toNativeSeparators(sourcePath)), MUTILS_WCHR(QDir::toNativeSeparators(outputPath)), overwrite ? FALSE : TRUE);
|
MUtils::OS::progress_callback_t callback_function;
|
||||||
|
void *user_data;
|
||||||
|
}
|
||||||
|
progress_callback_data_t;
|
||||||
|
|
||||||
|
static DWORD __stdcall copy_file_progress(LARGE_INTEGER TotalFileSize, LARGE_INTEGER TotalBytesTransferred, LARGE_INTEGER StreamSize, LARGE_INTEGER StreamBytesTransferred, DWORD dwStreamNumber, DWORD dwCallbackReason, HANDLE hSourceFile, HANDLE hDestinationFile, LPVOID lpData)
|
||||||
|
{
|
||||||
|
if(const progress_callback_data_t *data = (progress_callback_data_t*) lpData)
|
||||||
|
{
|
||||||
|
const double progress = qBound(0.0, double(TotalBytesTransferred.QuadPart) / double(TotalFileSize.QuadPart), 1.0);
|
||||||
|
return data->callback_function(progress, data->user_data) ? PROGRESS_CONTINUE : PROGRESS_CANCEL;
|
||||||
|
}
|
||||||
|
return PROGRESS_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
MUTILS_API bool MUtils::OS::copy_file(const QString &sourcePath, const QString &outputPath, const bool &overwrite, const progress_callback_t callback, void *const userData)
|
||||||
|
{
|
||||||
|
progress_callback_data_t callback_data = { callback, userData };
|
||||||
|
BOOL cancel = FALSE;
|
||||||
|
const BOOL result = CopyFileExW(MUTILS_WCHR(QDir::toNativeSeparators(sourcePath)), MUTILS_WCHR(QDir::toNativeSeparators(outputPath)), ((callback_data.callback_function) ? copy_file_progress : NULL), ((callback_data.callback_function) ? &callback_data : NULL), &cancel, (overwrite ? 0 : COPY_FILE_FAIL_IF_EXISTS));
|
||||||
|
|
||||||
if(result == FALSE)
|
if(result == FALSE)
|
||||||
{
|
{
|
||||||
const DWORD errorCode = GetLastError();
|
const DWORD errorCode = GetLastError();
|
||||||
|
if(errorCode != ERROR_REQUEST_ABORTED)
|
||||||
|
{
|
||||||
qWarning("CopyFile() failed with error code 0x%08X!", errorCode);
|
qWarning("CopyFile() failed with error code 0x%08X!", errorCode);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qWarning("CopyFile() operation was abroted by user!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (result != FALSE);
|
return (result != FALSE);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user