#pragma once #include "IO.Stream.hpp" #include "Utility.Either+Error.hpp" #pragma warning (disable : 4275) // warning C4275 : 非 dll 接口 class“ECOM::IO::Stream::IStream”用作 dll 接口 class“ECOM::IO::Stream::IFileStream”的基 #ifndef _IO_FileStream_EXPORTS #define _IO_FileStream_API _declspec(dllimport) #else #define _IO_FileStream_API _declspec(dllexport) #endif #ifndef _IO_FileStream_EXPORTS #ifdef _WIN64 #ifdef _DEBUG #pragma comment (lib, "ECOM.IO.FileStream64D.lib") #else #pragma comment (lib, "ECOM.IO.FileStream64.lib") #endif #else // X86 #ifdef _DEBUG #pragma comment (lib, "ECOM.IO.FileStreamD.lib") #else #pragma comment (lib, "ECOM.IO.FileStream.lib") #endif #endif #endif // _IO_FileStream_EXPORTS //----------------------------------------------------------------------------- // IFileStream, OFileStream // 给定文件名, 生成流 //----------------------------------------------------------------------------- namespace ECOM::IO::Stream { enum class enShareMode { shareCompat = (int)0x00000, shareExclusive = (int)0x00010, shareDenyWrite = (int)0x00020, shareDenyRead = (int)0x00030, shareDenyNone = (int)0x00040, }; class _IO_FileStream_API IFileStream : public ECOM::IO::Stream::IStream { using base = ECOM::IO::Stream::IStream; public: IFileStream (); IFileStream (const wchar_t * filename, enShareMode mode = enShareMode::shareDenyWrite); virtual ~IFileStream (); IFileStream & operator = (IFileStream && from) { m_NIB = std::move (from.m_NIB); return (*this); } IFileStream (IFileStream && from); IFileStream (const IFileStream & from) = delete; IFileStream & operator = (const IFileStream & from) = delete; public: eiResult OpenForRead (const wchar_t * filename, enShareMode mode = enShareMode::shareDenyWrite); }; class _IO_FileStream_API OFileStream : public ECOM::IO::Stream::OStream { using base = ECOM::IO::Stream::OStream; public: OFileStream (); OFileStream (const wchar_t * filename, enShareMode mode = enShareMode::shareDenyWrite); virtual ~OFileStream (); OFileStream & operator = (OFileStream && from) { m_NOB = std::move (from.m_NOB); return (*this); } OFileStream (OFileStream && from); OFileStream (const OFileStream & from) = delete; OFileStream & operator = (const OFileStream & from) = delete; public: eiResult OpenForWrite (const wchar_t * filename, enShareMode mode = enShareMode::shareDenyWrite); }; } #include #include "HandleHolder.hpp" //----------------------------------------------------------------------------- // IStreamOnHandle, OStreamOnHandle // 给定文件句柄, 生成流 // 句柄是以 shared_ptr 方式给的, 因此可以 IO 共享 //----------------------------------------------------------------------------- namespace ECOM::IO::Stream { class _IO_FileStream_API IStreamOnHandle : public ECOM::IO::Stream::IStream { using base = ECOM::IO::Stream::IStream; public: IStreamOnHandle (std::shared_ptr Holder); virtual ~IStreamOnHandle (); IStreamOnHandle & operator = (IStreamOnHandle && from) { m_NIB = std::move (from.m_NIB); return (*this); } IStreamOnHandle (IStreamOnHandle && from); IStreamOnHandle (const IStreamOnHandle & from) = delete; IStreamOnHandle & operator = (const IStreamOnHandle & from) = delete; }; class _IO_FileStream_API OStreamOnHandle : public ECOM::IO::Stream::OStream { using base = ECOM::IO::Stream::OStream; public: OStreamOnHandle (std::shared_ptr Holder); virtual ~OStreamOnHandle (); OStreamOnHandle & operator = (OStreamOnHandle && from) { m_NOB = std::move (from.m_NOB); return (*this); } OStreamOnHandle (OStreamOnHandle && from); OStreamOnHandle (const OStreamOnHandle & from) = delete; OStreamOnHandle & operator = (const OStreamOnHandle & from) = delete; }; }