IO.FileStream.hpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #pragma once
  2. #include "IO.Stream.hpp"
  3. #include "Utility.Either+Error.hpp"
  4. #pragma warning (disable : 4275)
  5. // warning C4275 : 非 dll 接口 class“ECOM::IO::Stream::IStream”用作 dll 接口 class“ECOM::IO::Stream::IFileStream”的基
  6. #ifndef _IO_FileStream_EXPORTS
  7. #define _IO_FileStream_API _declspec(dllimport)
  8. #else
  9. #define _IO_FileStream_API _declspec(dllexport)
  10. #endif
  11. #ifndef _IO_FileStream_EXPORTS
  12. #ifdef _WIN64
  13. #ifdef _DEBUG
  14. #pragma comment (lib, "ECOM.IO.FileStream64D.lib")
  15. #else
  16. #pragma comment (lib, "ECOM.IO.FileStream64.lib")
  17. #endif
  18. #else // X86
  19. #ifdef _DEBUG
  20. #pragma comment (lib, "ECOM.IO.FileStreamD.lib")
  21. #else
  22. #pragma comment (lib, "ECOM.IO.FileStream.lib")
  23. #endif
  24. #endif
  25. #endif // _IO_FileStream_EXPORTS
  26. //-----------------------------------------------------------------------------
  27. // IFileStream, OFileStream
  28. // 给定文件名, 生成流
  29. //-----------------------------------------------------------------------------
  30. namespace ECOM::IO::Stream
  31. {
  32. enum class enShareMode
  33. {
  34. shareCompat = (int)0x00000,
  35. shareExclusive = (int)0x00010,
  36. shareDenyWrite = (int)0x00020,
  37. shareDenyRead = (int)0x00030,
  38. shareDenyNone = (int)0x00040,
  39. };
  40. class _IO_FileStream_API IFileStream : public ECOM::IO::Stream::IStream
  41. {
  42. using base = ECOM::IO::Stream::IStream;
  43. public:
  44. IFileStream ();
  45. IFileStream (const wchar_t * filename, enShareMode mode = enShareMode::shareDenyWrite);
  46. virtual ~IFileStream ();
  47. IFileStream & operator = (IFileStream && from)
  48. {
  49. m_NIB = std::move (from.m_NIB);
  50. return (*this);
  51. }
  52. IFileStream (IFileStream && from);
  53. IFileStream (const IFileStream & from) = delete;
  54. IFileStream & operator = (const IFileStream & from) = delete;
  55. public:
  56. eiResult OpenForRead (const wchar_t * filename, enShareMode mode = enShareMode::shareDenyWrite);
  57. };
  58. class _IO_FileStream_API OFileStream : public ECOM::IO::Stream::OStream
  59. {
  60. using base = ECOM::IO::Stream::OStream;
  61. public:
  62. OFileStream ();
  63. OFileStream (const wchar_t * filename, enShareMode mode = enShareMode::shareDenyWrite);
  64. virtual ~OFileStream ();
  65. OFileStream & operator = (OFileStream && from)
  66. {
  67. m_NOB = std::move (from.m_NOB);
  68. return (*this);
  69. }
  70. OFileStream (OFileStream && from);
  71. OFileStream (const OFileStream & from) = delete;
  72. OFileStream & operator = (const OFileStream & from) = delete;
  73. public:
  74. eiResult OpenForWrite (const wchar_t * filename, enShareMode mode = enShareMode::shareDenyWrite);
  75. };
  76. }
  77. #include <memory>
  78. #include "HandleHolder.hpp"
  79. //-----------------------------------------------------------------------------
  80. // IStreamOnHandle, OStreamOnHandle
  81. // 给定文件句柄, 生成流
  82. // 句柄是以 shared_ptr <HandleHolder> 方式给的, 因此可以 IO 共享
  83. //-----------------------------------------------------------------------------
  84. namespace ECOM::IO::Stream
  85. {
  86. class _IO_FileStream_API IStreamOnHandle : public ECOM::IO::Stream::IStream
  87. {
  88. using base = ECOM::IO::Stream::IStream;
  89. public:
  90. IStreamOnHandle (std::shared_ptr <HandleHolder> Holder);
  91. virtual ~IStreamOnHandle ();
  92. IStreamOnHandle & operator = (IStreamOnHandle && from)
  93. {
  94. m_NIB = std::move (from.m_NIB);
  95. return (*this);
  96. }
  97. IStreamOnHandle (IStreamOnHandle && from);
  98. IStreamOnHandle (const IStreamOnHandle & from) = delete;
  99. IStreamOnHandle & operator = (const IStreamOnHandle & from) = delete;
  100. };
  101. class _IO_FileStream_API OStreamOnHandle : public ECOM::IO::Stream::OStream
  102. {
  103. using base = ECOM::IO::Stream::OStream;
  104. public:
  105. OStreamOnHandle (std::shared_ptr <HandleHolder> Holder);
  106. virtual ~OStreamOnHandle ();
  107. OStreamOnHandle & operator = (OStreamOnHandle && from)
  108. {
  109. m_NOB = std::move (from.m_NOB);
  110. return (*this);
  111. }
  112. OStreamOnHandle (OStreamOnHandle && from);
  113. OStreamOnHandle (const OStreamOnHandle & from) = delete;
  114. OStreamOnHandle & operator = (const OStreamOnHandle & from) = delete;
  115. };
  116. }