FileStream.h
上传用户:kx_jwh
上传日期:2021-09-03
资源大小:76k
文件大小:2k
源码类别:

STL

开发平台:

Visual C++

  1. /* vim: set tabstop=4 : */
  2. #ifndef __febird_io_FileStream_h__
  3. #define __febird_io_FileStream_h__
  4. #if defined(_MSC_VER) && (_MSC_VER >= 1020)
  5. # pragma once
  6. #endif
  7. #include <stdio.h>
  8. #include <assert.h>
  9. #include "../stdtypes.h"
  10. #include "../refcount.h"
  11. #include "IOException.h"
  12. #include "IStream.h"
  13. namespace febird {
  14. class FEBIRD_DLL_EXPORT FileStream
  15. : public RefCounter
  16. , public IInputStream
  17. , public IOutputStream
  18. , public ISeekable
  19. {
  20. DECLARE_NONE_COPYABLE_CLASS(FileStream)
  21. protected:
  22. FILE* m_fp;
  23. public:
  24. typedef boost::mpl::true_ is_seekable;
  25. static bool copyFile(const char* srcPath, const char* dstPath);
  26. static void ThrowOpenFileException(const char* fpath, const char* mode);
  27. public:
  28. FileStream(const char* fpath, const char* mode);
  29. FileStream(int fd, const char* mode);
  30. // explicit FileStream(FILE* fp = 0) throw() : m_fp(fp) {}
  31. FileStream() throw() : m_fp(0) {} // 不是我打开的文件,请显式 attach/detach
  32. ~FileStream() throw() { if (m_fp) ::fclose(m_fp); }
  33. bool isOpen() const throw() { return 0 != m_fp; }
  34. operator FILE*() const throw() { return m_fp; }
  35. void open(const char* fpath, const char* mode);
  36. //! no throw
  37. bool xopen(const char* fpath, const char* mode) throw();
  38. void dopen(int fd, const char* mode) throw();
  39. void close() throw();
  40. void attach(::FILE* fp) throw();
  41. FILE* detach() throw();
  42. FILE* fp() const throw() { return m_fp; }
  43. bool eof() const throw() { return !!feof(m_fp); }
  44. int  getByte() throw() { return fgetc(m_fp); }
  45. byte readByte() throw(EndOfFileException);
  46. void writeByte(byte b);
  47. void ensureRead(void* vbuf, size_t length);
  48. void ensureWrite(const void* vbuf, size_t length);
  49. size_t read(void* buf, size_t size) throw();
  50. size_t write(const void* buf, size_t size) throw();
  51. void flush();
  52. void seek(stream_offset_t offset, int origin);
  53. void seek(stream_position_t pos);
  54. stream_position_t tell();
  55. stream_position_t size() const throw();
  56. void disbuf() throw();
  57. };
  58. inline byte FileStream::readByte() throw(EndOfFileException)
  59. {
  60. assert(m_fp);
  61. int ch = fgetc(m_fp);
  62. if (-1 == ch)
  63. throw EndOfFileException(BOOST_CURRENT_FUNCTION);
  64. return ch;
  65. }
  66. inline void FileStream::writeByte(byte b)
  67. {
  68. assert(m_fp);
  69. if (EOF == fputc(b, m_fp))
  70. throw OutOfSpaceException(BOOST_CURRENT_FUNCTION);
  71. }
  72. } // namespace febird
  73. #endif