Index: src/libchcore/TOverlappedWriterFB.cpp =================================================================== diff -u -N -r937da76497c6099de5b656f396c515907a528044 -rbaad6054459abaaf69cbfd1ebad8783085160d99 --- src/libchcore/TOverlappedWriterFB.cpp (.../TOverlappedWriterFB.cpp) (revision 937da76497c6099de5b656f396c515907a528044) +++ src/libchcore/TOverlappedWriterFB.cpp (.../TOverlappedWriterFB.cpp) (revision baad6054459abaaf69cbfd1ebad8783085160d99) @@ -40,12 +40,14 @@ const TBufferListPtr& spEmptyBuffers, bool bOnlyCreate, bool bNoBuffering, - bool bProtectReadOnlyFiles) : + bool bProtectReadOnlyFiles, + bool bUpdateFileAttributesAndTimes) : m_spWriter(std::make_shared(spLogFileData, spBuffersToWrite, spRange, spEmptyBuffers)), m_spStats(spStats), m_spSrcFileInfo(spSrcFileInfo), m_spDataRange(spRange), m_bOnlyCreate(bOnlyCreate), + m_bUpdateFileAttributesAndTimes(bUpdateFileAttributesAndTimes), m_eventProcessingFinished(true, false), m_eventWritingFinished(true, false), m_eventLocalKill(true, false), @@ -117,11 +119,15 @@ file_size_t fsWritten = pBuffer->GetRealDataSize(); + bool bIsLastBuffer = pBuffer->IsLastPart(); TSubTaskBase::ESubOperationResult eResult = TSubTaskBase::eSubResult_Continue; - if(pBuffer->IsLastPart()) + if(bIsLastBuffer) { eResult = m_spDstFile->FinalizeFileFB(*pBuffer); - if (eResult != TSubTaskBase::eSubResult_Continue) + if(eResult == TSubTaskBase::eSubResult_Continue && m_bUpdateFileAttributesAndTimes) + eResult = m_spDstFile->SetBasicInfo(m_spSrcFileInfo->GetAttributes(), m_spSrcFileInfo->GetCreationTime(), m_spSrcFileInfo->GetLastAccessTime(), m_spSrcFileInfo->GetLastWriteTime()); + + if(eResult != TSubTaskBase::eSubResult_Continue) { m_spWriter->AddEmptyBuffer(pBuffer); return eResult; @@ -132,8 +138,7 @@ AdjustProcessedSize(fsWritten); // stop iterating through file - bStopProcessing = pBuffer->IsLastPart(); - if(bStopProcessing) + if(bIsLastBuffer) { m_spWriter->MarkAsFinalized(pBuffer); @@ -148,6 +153,8 @@ m_spWriter->AddEmptyBuffer(pBuffer); + bStopProcessing = bIsLastBuffer; + return eResult; }