diff options
-rw-r--r-- | include/tools/stream.hxx | 4 | ||||
-rw-r--r-- | tools/source/stream/strmunx.cxx | 5 | ||||
-rw-r--r-- | tools/source/stream/strmwnt.cxx | 5 | ||||
-rw-r--r-- | unotools/source/ucbhelper/tempfile.cxx | 3 |
4 files changed, 14 insertions, 3 deletions
diff --git a/include/tools/stream.hxx b/include/tools/stream.hxx index f99b09955368..e99d41c8ac45 100644 --- a/include/tools/stream.hxx +++ b/include/tools/stream.hxx @@ -49,7 +49,7 @@ enum class StreamMode { NOCREATE = 0x0004, ///< 1 == Don't create file TRUNC = 0x0008, ///< Truncate _existing_ file to zero length COPY_ON_SYMLINK = 0x0010, ///< copy-on-write for symlinks (Unix) - TEMPORARY = 0x0020, ///< temporary file attribute (Windows) + TEMPORARY = 0x0020, ///< temporary file attribute (Windows-only) // sharing options SHARE_DENYNONE = 0x0100, SHARE_DENYREAD = 0x0200, // overrides denynone @@ -586,6 +586,7 @@ private: sal_uInt16 nLockCounter; #endif bool bIsOpen; + bool mbDontFlushOnClose; ///< used to avoid flushing when closing temporary files SvFileStream (const SvFileStream&) = delete; SvFileStream & operator= (const SvFileStream&) = delete; @@ -612,6 +613,7 @@ public: bool IsOpen() const { return bIsOpen; } const OUString& GetFileName() const { return aFilename; } + void SetDontFlushOnClose(bool b) { mbDontFlushOnClose = b; } }; // MemoryStream diff --git a/tools/source/stream/strmunx.cxx b/tools/source/stream/strmunx.cxx index 0b745e69b140..e034f53ac33b 100644 --- a/tools/source/stream/strmunx.cxx +++ b/tools/source/stream/strmunx.cxx @@ -197,6 +197,7 @@ SvFileStream::SvFileStream( const OUString& rFileName, StreamMode nOpenMode ) { bIsOpen = false; m_isWritable = false; + mbDontFlushOnClose = false; pInstanceData.reset(new StreamData); SetBufferSize( 1024 ); @@ -214,6 +215,7 @@ SvFileStream::SvFileStream() { bIsOpen = false; m_isWritable = false; + mbDontFlushOnClose = false; pInstanceData.reset(new StreamData); SetBufferSize( 1024 ); } @@ -457,7 +459,8 @@ void SvFileStream::Close() if ( IsOpen() ) { SAL_INFO("tools", "Closing " << aFilename); - Flush(); + if ( !mbDontFlushOnClose ) + Flush(); osl_closeFile( pInstanceData->rHandle ); pInstanceData->rHandle = nullptr; } diff --git a/tools/source/stream/strmwnt.cxx b/tools/source/stream/strmwnt.cxx index d85ce3a0c372..c91628b55091 100644 --- a/tools/source/stream/strmwnt.cxx +++ b/tools/source/stream/strmwnt.cxx @@ -107,6 +107,7 @@ SvFileStream::SvFileStream( const OUString& rFileName, StreamMode nMode ) bIsOpen = false; nLockCounter = 0; m_isWritable = false; + mbDontFlushOnClose = false; pInstanceData.reset( new StreamData ); SetBufferSize( 8192 ); @@ -123,6 +124,7 @@ SvFileStream::SvFileStream() bIsOpen = false; nLockCounter = 0; m_isWritable = false; + mbDontFlushOnClose = false; pInstanceData.reset( new StreamData ); SetBufferSize( 8192 ); @@ -377,7 +379,8 @@ void SvFileStream::Close() nLockCounter = 1; UnlockFile(); } - Flush(); + if ( !mbDontFlushOnClose ) + Flush(); CloseHandle( pInstanceData->hFile ); } bIsOpen = false; diff --git a/unotools/source/ucbhelper/tempfile.cxx b/unotools/source/ucbhelper/tempfile.cxx index c63287efe114..25c15920d52b 100644 --- a/unotools/source/ucbhelper/tempfile.cxx +++ b/unotools/source/ucbhelper/tempfile.cxx @@ -386,6 +386,9 @@ TempFile::TempFile(TempFile && other) noexcept : TempFile::~TempFile() { + // if we're going to delete this file, no point in flushing it when closing + if (pStream && bKillingFileEnabled && !aName.isEmpty()) + static_cast<SvFileStream*>(pStream.get())->SetDontFlushOnClose(true); pStream.reset(); if ( bKillingFileEnabled ) { |