67 lines
1.6 KiB
C++
67 lines
1.6 KiB
C++
|
#include "windows.h"
|
||
|
#include <stdio.h>
|
||
|
|
||
|
BOOL
|
||
|
ForceCopy(
|
||
|
LPCSTR lpszSourceFileName,
|
||
|
LPCSTR lpszDestFileName
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Params: lpszSourceFileName Pointer to the source file.
|
||
|
lpzDestFileName Pointer to the destination file.
|
||
|
|
||
|
Return: TRUE on success, FALSE otherwise.
|
||
|
|
||
|
Desc: Attempts to copy a file. If it's in use, move it and replace on reboot.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
char szTempPath[MAX_PATH];
|
||
|
char szDelFileName[MAX_PATH];
|
||
|
|
||
|
if (!CopyFileA(lpszSourceFileName, lpszDestFileName, FALSE)) {
|
||
|
|
||
|
if (GetTempPathA(MAX_PATH, szTempPath) == 0) {
|
||
|
printf("GetTempPath failed with 0x%x\n", GetLastError());
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
if (GetTempFileNameA(szTempPath, "DEL", 0, szDelFileName) == 0) {
|
||
|
printf("GetTempFileName failed with 0x%x\n", GetLastError());
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
if (!MoveFileExA(lpszDestFileName, szDelFileName, MOVEFILE_REPLACE_EXISTING)) {
|
||
|
printf("MoveFileEx failed with 0x%x\n", GetLastError());
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
if (!MoveFileExA(szDelFileName, NULL, MOVEFILE_DELAY_UNTIL_REBOOT)) {
|
||
|
printf("MoveFileEx failed with 0x%x\n", GetLastError());
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
if (!CopyFileA(lpszSourceFileName, lpszDestFileName, FALSE)) {
|
||
|
printf("CopyFile failed with 0x%x\n", GetLastError());
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
int __cdecl
|
||
|
main(
|
||
|
int argc,
|
||
|
CHAR* argv[]
|
||
|
)
|
||
|
{
|
||
|
if (argc != 3) {
|
||
|
printf("Usage: forcecopy SourceFile DestFile\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
return ForceCopy(argv[1], argv[2]);
|
||
|
}
|