Index: src/libchcore/TLocalFilesystem.cpp =================================================================== diff -u -N -rea7d62521e78371cff90579749d136cb928c9e88 -r3c343f2e7aa0d489706136e78f2f56cdd5d417a9 --- src/libchcore/TLocalFilesystem.cpp (.../TLocalFilesystem.cpp) (revision ea7d62521e78371cff90579749d136cb928c9e88) +++ src/libchcore/TLocalFilesystem.cpp (.../TLocalFilesystem.cpp) (revision 3c343f2e7aa0d489706136e78f2f56cdd5d417a9) @@ -390,7 +390,7 @@ DWORD TLocalFilesystemFile::GetFlagsAndAttributes(bool bNoBuffering) const { - return FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffering ? FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH : 0); + return FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffering ? FILE_FLAG_NO_BUFFERING /*| FILE_FLAG_WRITE_THROUGH*/ : 0); } bool TLocalFilesystemFile::OpenExistingForReading(const TSmartPath& pathFile, bool bNoBuffering) @@ -469,7 +469,8 @@ case ERROR_HANDLE_EOF: { rBuffer.SetBytesTransferred(0); - rBuffer.SetStatusCode(ERROR_SUCCESS); + rBuffer.SetStatusCode(0); + rBuffer.SetErrorCode(ERROR_SUCCESS); rBuffer.SetLastPart(true); rBuffer.RequeueAsFull(); // basically the same as OverlappedReadCompleted @@ -489,30 +490,45 @@ THROW_CORE_EXCEPTION(eErr_InternalProblem); DWORD dwToWrite = boost::numeric_cast(rBuffer.GetBytesTransferred()); - unsigned long long ullNewFileSize = 0; if (m_bNoBuffering && rBuffer.IsLastPart()) - { dwToWrite = RoundUp(dwToWrite, MaxSectorSize); - if(dwToWrite != boost::numeric_cast(rBuffer.GetBytesTransferred())) - ullNewFileSize = rBuffer.GetFilePosition() + dwToWrite; // new size - } if (!::WriteFileEx(m_hFile, rBuffer.GetBufferPtr(), dwToWrite, &rBuffer, OverlappedWriteCompleted)) + { + if (GetLastError() == ERROR_IO_PENDING) + return true; return false; + } - if(ullNewFileSize != 0) + return true; +} + +bool TLocalFilesystemFile::FinalizeFile(TOverlappedDataBuffer& rBuffer) +{ + if (!IsOpen()) + THROW_CORE_EXCEPTION(eErr_InternalProblem); + + if (m_bNoBuffering && rBuffer.IsLastPart()) { - if(!OpenExistingForWriting(m_pathFile, false)) - return false; + DWORD dwToWrite = boost::numeric_cast(rBuffer.GetBytesTransferred()); + DWORD dwReallyWritten = RoundUp(dwToWrite, MaxSectorSize); - //seek - if(!SetFilePointer(ullNewFileSize, FILE_BEGIN)) - return false; + if (dwToWrite != dwReallyWritten) + { + unsigned long long ullNewFileSize = rBuffer.GetFilePosition() + dwToWrite; // new size - //set eof - if(!SetEndOfFile()) - return false; + if (!OpenExistingForWriting(m_pathFile, false)) + return false; + + //seek + if (!SetFilePointer(ullNewFileSize, FILE_BEGIN)) + return false; + + //set eof + if (!SetEndOfFile()) + return false; + } } return true;