include/tools/stream.hxx | 5 +++-- tools/source/stream/strmwnt.cxx | 2 ++ unotools/source/ucbhelper/tempfile.cxx | 9 +++++++++ 3 files changed, 14 insertions(+), 2 deletions(-)
New commits: commit 1ea0ea19f1dc13c4191ab9d4222adfd2579b802c Author: Noel Grandin <noelgran...@collabora.co.uk> AuthorDate: Mon Oct 24 09:06:42 2022 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Mon Oct 24 10:10:54 2022 +0200 tdf#133768 speed up temp file creation Use DELETE_ON_CLOSE attribute, so we can avoid calling osl_removeFile. Shaves 5% off the export time. Change-Id: I4fef8f181ef7a92c4805cc5996c3a17800a22602 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141718 Tested-by: Noel Grandin <noel.gran...@collabora.co.uk> Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/include/tools/stream.hxx b/include/tools/stream.hxx index c56a3d44cef6..b141c8ed44f7 100644 --- a/include/tools/stream.hxx +++ b/include/tools/stream.hxx @@ -50,8 +50,9 @@ enum class StreamMode { // file i/o 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) + COPY_ON_SYMLINK = 0x0010, ///< copy-on-write for symlinks (Unix-only) TEMPORARY = 0x0020, ///< temporary file attribute (Windows-only) + DELETE_ON_CLOSE = 0x0040, ///< only for temporary files (Windows-only) // sharing options SHARE_DENYNONE = 0x0100, SHARE_DENYREAD = 0x0200, // overrides denynone @@ -65,7 +66,7 @@ enum class StreamMode { }; namespace o3tl { - template<> struct typed_flags<StreamMode> : is_typed_flags<StreamMode, 0x0f3f> {}; + template<> struct typed_flags<StreamMode> : is_typed_flags<StreamMode, 0x0f7f> {}; } #define STREAM_SEEK_TO_BEGIN 0L diff --git a/tools/source/stream/strmwnt.cxx b/tools/source/stream/strmwnt.cxx index 4ea9c7eb1d42..f88cbe307606 100644 --- a/tools/source/stream/strmwnt.cxx +++ b/tools/source/stream/strmwnt.cxx @@ -304,6 +304,8 @@ void SvFileStream::Open( const OUString& rFilename, StreamMode nMode ) if ( nMode & StreamMode::TEMPORARY ) nAttributes |= FILE_ATTRIBUTE_TEMPORARY; + if ( nMode & StreamMode::DELETE_ON_CLOSE ) + nAttributes |= FILE_FLAG_DELETE_ON_CLOSE; pInstanceData->hFile = CreateFileW( o3tl::toW(aFilename.getStr()), diff --git a/unotools/source/ucbhelper/tempfile.cxx b/unotools/source/ucbhelper/tempfile.cxx index 61ef2d247c01..efeb872b5d6d 100644 --- a/unotools/source/ucbhelper/tempfile.cxx +++ b/unotools/source/ucbhelper/tempfile.cxx @@ -409,7 +409,11 @@ SvStream* TempFileFast::GetStream( StreamMode eMode ) if (!mxStream) { OUString aName = CreateTempNameFast(); +#ifdef _WIN32 + mxStream.reset(new SvFileStream(aName, eMode | StreamMode::TEMPORARY | StreamMode::DELETE_ON_CLOSE)); +#else mxStream.reset(new SvFileStream(aName, eMode | StreamMode::TEMPORARY)); +#endif } return mxStream.get(); } @@ -420,8 +424,13 @@ void TempFileFast::CloseStream() { OUString aName = mxStream->GetFileName(); mxStream.reset(); +#ifdef _WIN32 + // On Windows, the file is opened with FILE_FLAG_DELETE_ON_CLOSE, so it will delete as soon as the handle closes. + // On other platforms, we need to explicitly delete it. +#else if (!aName.isEmpty() && (osl::FileBase::getFileURLFromSystemPath(aName, aName) == osl::FileBase::E_None)) File::remove(aName); +#endif } }