| 532 | } |
| 533 | |
| 534 | void MergeFiles::StartMerging() |
| 535 | { |
| 536 | LARGE_INTEGER lMergeFileSize; |
| 537 | int nFilesMerged = 1; |
| 538 | bool bStop = false; |
| 539 | |
| 540 | HANDLE hOutputFile = CreateFile(m_strOutputFilename.c_str(), GENERIC_WRITE, 0, nullptr, |
| 541 | CREATE_NEW, FILE_ATTRIBUTE_NORMAL, nullptr); |
| 542 | |
| 543 | if (hOutputFile == INVALID_HANDLE_VALUE) |
| 544 | { |
| 545 | PostMessage(m_hDlg, NMergeFilesDialog::WM_APP_OUTPUTFILEINVALID, 0, 0); |
| 546 | return; |
| 547 | } |
| 548 | |
| 549 | PostMessage(m_hDlg, NMergeFilesDialog::WM_APP_SETTOTALMERGECOUNT, |
| 550 | static_cast<WPARAM>(m_FullFilenameList.size()), 0); |
| 551 | |
| 552 | for (const auto &strFullFilename : m_FullFilenameList) |
| 553 | { |
| 554 | if (bStop) |
| 555 | { |
| 556 | break; |
| 557 | } |
| 558 | |
| 559 | HANDLE hInputFile = CreateFile(strFullFilename.c_str(), GENERIC_READ, FILE_SHARE_READ, |
| 560 | nullptr, OPEN_EXISTING, 0, nullptr); |
| 561 | |
| 562 | if (hInputFile != INVALID_HANDLE_VALUE) |
| 563 | { |
| 564 | GetFileSizeEx(hInputFile, &lMergeFileSize); |
| 565 | |
| 566 | if (lMergeFileSize.QuadPart != 0) |
| 567 | { |
| 568 | auto buffer = std::make_unique<char[]>(lMergeFileSize.LowPart); |
| 569 | |
| 570 | DWORD dwNumberOfBytesRead; |
| 571 | ReadFile(hInputFile, reinterpret_cast<LPVOID>(buffer.get()), |
| 572 | static_cast<DWORD>(lMergeFileSize.LowPart), &dwNumberOfBytesRead, nullptr); |
| 573 | |
| 574 | DWORD dwNumberOfBytesWritten; |
| 575 | WriteFile(hOutputFile, reinterpret_cast<LPCVOID>(buffer.get()), dwNumberOfBytesRead, |
| 576 | &dwNumberOfBytesWritten, nullptr); |
| 577 | } |
| 578 | |
| 579 | CloseHandle(hInputFile); |
| 580 | |
| 581 | PostMessage(m_hDlg, NMergeFilesDialog::WM_APP_SETCURRENTMERGECOUNT, nFilesMerged, 0); |
| 582 | |
| 583 | nFilesMerged++; |
| 584 | |
| 585 | EnterCriticalSection(&m_csStop); |
| 586 | if (m_bstopMerging) |
| 587 | { |
| 588 | bStop = true; |
| 589 | } |
| 590 | LeaveCriticalSection(&m_csStop); |
| 591 | } |
no test coverage detected