15 #ifndef INCG_IRIS_IUTEST_FILE_HPP_77D2C2B9_F504_4BB5_BA56_D97A2EB37DC6_
16 #define INCG_IRIS_IUTEST_FILE_HPP_77D2C2B9_F504_4BB5_BA56_D97A2EB37DC6_
24 #if defined(IUTEST_OS_WINDOWS)
39 class IFile :
public detail::IOutStream,
public detail::IInStream
59 bool Open(
const char* filename,
int mode)
61 return OpenImpl(filename, mode);
64 #if IUTEST_HAS_STD_FILESYSTEM
71 bool Open(const ::std::filesystem::path& path,
int mode)
73 return Open(path.string().c_str(), mode);
78 virtual void Close() = 0;
80 virtual bool OpenImpl(
const char* filename,
int mode) = 0;
96 virtual ~IFileSystem()
102 virtual void Initialize() {}
105 static IFileSystem* GetInstance() {
return GetInstanceVariable().pInstance; }
110 IFileSystem* fs = GetInstance();
115 IFile* p = fs->Create();
118 static void Free(
IFile* ptr)
120 IFileSystem* fs = GetInstance();
128 static bool ReadAll(
const char* filename, ::std::string& dst)
130 IFile* fp = detail::IFileSystem::New();
138 detail::IFileSystem::Free(fp);
143 detail::IFileSystem::Free(fp);
148 virtual IFile* Create() = 0;
149 virtual void Delete(
IFile*) = 0;
152 struct InstanceVariable
154 IFileSystem* pInstance;
157 static InstanceVariable& GetInstanceVariable() {
static InstanceVariable v;
return v; }
158 static void SetInstance(IFileSystem* pFileSystem) { GetInstanceVariable().pInstance = pFileSystem; }
170 template<
typename FILE>
211 if( fwrite(buf, size, cnt, m_fp) < cnt )
215 if( fflush(m_fp) != 0 )
230 if( fread(buf, size, cnt, m_fp) < cnt )
250 static iu_uint_max_t
GetSize(FILE* fp)
252 return internal::posix::FileSize(fp);
254 static iu_uint_max_t GetSizeBySeekSet(FILE* fp)
256 return internal::posix::FileSizeBySeekSet(fp);
265 m_fp = internal::posix::FileOpen(filename,
"rb");
268 m_fp = internal::posix::FileOpen(filename,
"wb");
271 m_fp = internal::posix::FileOpen(filename,
"ab");
280 class StdErrorFile :
public StdioFile
301 class TempFile :
public IFile
320 internal::posix::FdClose(m_fd);
332 return m_file.
Write(buf, size, cnt);
343 return m_file.
Read(buf, size, cnt);
353 int GetDescriptor()
const {
return m_fd; }
354 const ::std::string& GetFileName()
const {
return m_filename; }
358 return OpenImpl(m_filename.c_str(), mode);
364 if( !m_filename.empty() )
366 remove(m_filename.c_str());
371 bool Create(
const char* basename)
373 #if defined(IUTEST_OS_WINDOWS)
374 char tmp_dir[IUTEST_MAX_PATH] = {
'\0' };
375 GetTempPathA(
sizeof(tmp_dir), tmp_dir);
377 char name_template[IUTEST_MAX_PATH] = {
'\0' };
378 UINT ret = GetTempFileNameA(tmp_dir, basename, 0, name_template);
379 IUTEST_CHECK_(ret != 0) <<
"Unable to create a temporary file in " << tmp_dir;
380 #if defined(_CRT_FUNCTIONS_REQUIRED)
381 IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_BEGIN()
382 const
int fd = _creat(name_template, _S_IREAD | _S_IWRITE);
383 IUTEST_PRAGMA_CRT_SECURE_WARN_DISABLE_END()
385 #if defined(IUTEST_OS_WINDOWS_MINGW)
386 const int fd = _sopen(name_template, _O_CREAT | _O_RDWR, _SH_DENYNO, _S_IREAD | _S_IWRITE);
389 _sopen_s(&fd, name_template, _O_CREAT | _O_RDWR, _SH_DENYNO, _S_IREAD | _S_IWRITE);
393 #if defined(IUTEST_OS_LINUX_ANDROID)
394 ::std::string name_template =
"/data/local/tmp/";
395 #elif defined(IUTEST_OS_IOS)
396 char user_temp_dir[IUTEST_MAX_PATH];
397 ::confstr(_CS_DARWIN_USER_TEMP_DIR, user_temp_dir,
sizeof(user_temp_dir));
398 ::std::string name_template = user_temp_dir;
399 name_template +=
"/";
401 ::std::string name_template =
"/tmp/";
403 name_template += basename;
404 name_template +=
".XXXXXX";
405 const int fd = internal::posix::Mkstemp(
const_cast<char*
>(name_template.data()));
408 m_filename = name_template;
413 bool Open(
const char*,
int);
417 return m_file.
Open(filename, mode);
423 ::std::string m_filename;
429 #if IUTEST_HAS_STRINGSTREAM
434 class StringStreamFile :
public IFile
454 for(
size_t i=0; i < cnt; ++i )
456 ss.write(
static_cast<const char*
>(buf), size);
469 char* p =
static_cast<char*
>(buf);
470 for(
size_t i = 0; i < cnt; ++i )
481 ::std::stringstream::pos_type pre = ss.tellg();
482 ss.seekg(0, ::std::ios::end);
483 ::std::stringstream::pos_type size = ss.tellg();
484 ss.seekg(pre, ::std::ios::beg);
485 return static_cast<iu_uint_max_t
>(size);
500 ::std::stringstream ss;
ファイルクラスインターフェイス
Definition: iutest_file.hpp:41
bool Open(const char *filename, int mode)
開く
Definition: iutest_file.hpp:60
OpenFlag
ファイルオープンモードフラグ
Definition: iutest_file.hpp:45
@ OpenAppend
追記
Definition: iutest_file.hpp:48
@ OpenWrite
書き込み
Definition: iutest_file.hpp:47
@ OpenRead
読み込み
Definition: iutest_file.hpp:46
virtual void Close()=0
閉じる
Definition: iutest_file.hpp:282
virtual void Close() IUTEST_CXX_OVERRIDE
閉じる
Definition: iutest_file.hpp:290
標準ファイルクラス
Definition: iutest_file.hpp:186
virtual bool Write(const void *buf, size_t size, size_t cnt) IUTEST_CXX_OVERRIDE
書き込み
Definition: iutest_file.hpp:210
virtual bool Read(void *buf, size_t size, size_t cnt) IUTEST_CXX_OVERRIDE
読み込み
Definition: iutest_file.hpp:229
virtual iu_uint_max_t GetSize() IUTEST_CXX_OVERRIDE
サイズ取得
Definition: iutest_file.hpp:239
virtual void Close() IUTEST_CXX_OVERRIDE
閉じる
Definition: iutest_file.hpp:196
文字列バッファ書き込み IFile インターフェースクラス
Definition: iutest_file.hpp:436
virtual iu_uint_max_t GetSize() IUTEST_CXX_OVERRIDE
サイズ取得
Definition: iutest_file.hpp:480
virtual bool Read(void *buf, size_t size, size_t cnt) IUTEST_CXX_OVERRIDE
読み込み
Definition: iutest_file.hpp:468
virtual void Close() IUTEST_CXX_OVERRIDE
閉じる
Definition: iutest_file.hpp:443
virtual ::std::string ReadAll() IUTEST_CXX_OVERRIDE
全読み込み
Definition: iutest_file.hpp:490
virtual bool Write(const void *buf, size_t size, size_t cnt) IUTEST_CXX_OVERRIDE
書き込み
Definition: iutest_file.hpp:453
Definition: iutest_file.hpp:303
virtual bool Read(void *buf, size_t size, size_t cnt) IUTEST_CXX_OVERRIDE
読み込み
Definition: iutest_file.hpp:342
virtual iu_uint_max_t GetSize() IUTEST_CXX_OVERRIDE
サイズ取得
Definition: iutest_file.hpp:348
virtual bool Write(const void *buf, size_t size, size_t cnt) IUTEST_CXX_OVERRIDE
書き込み
Definition: iutest_file.hpp:331
virtual void Close() IUTEST_CXX_OVERRIDE
閉じる
Definition: iutest_file.hpp:316
#define IUTEST_CXX_FINAL
final definition
Definition: iutest_compiler.hpp:756
#define IUTEST_CXX_OVERRIDE
override definition
Definition: iutest_compiler.hpp:747
#define IUTEST_CXX_NOEXCEPT_SPEC
noexcept specification definition
Definition: iutest_compiler.hpp:811
#define IUTEST_CHECK_(condition)
内部エラーチェック
Definition: iutest_port.hpp:63
iutest root namespace
Definition: iutest_charcode.hpp:33