1// Common/C_FileIO.cpp
2
3#include "C_FileIO.h"
4
5#include <fcntl.h>
6#ifdef _WIN32
7#include <io.h>
8#else
9#include <unistd.h>
10#endif
11
12namespace NC {
13namespace NFile {
14namespace NIO {
15
16bool CFileBase::OpenBinary(const char *name, int flags)
17{
18  #ifdef O_BINARY
19  flags |= O_BINARY;
20  #endif
21  Close();
22  _handle = ::open(name, flags, 0666);
23  return _handle != -1;
24}
25
26bool CFileBase::Close()
27{
28  if (_handle == -1)
29    return true;
30  if (close(_handle) != 0)
31    return false;
32  _handle = -1;
33  return true;
34}
35
36bool CFileBase::GetLength(UInt64 &length) const
37{
38  off_t curPos = Seek(0, SEEK_CUR);
39  off_t lengthTemp = Seek(0, SEEK_END);
40  Seek(curPos, SEEK_SET);
41  length = (UInt64)lengthTemp;
42  return true;
43}
44
45off_t CFileBase::Seek(off_t distanceToMove, int moveMethod) const
46{
47  return ::lseek(_handle, distanceToMove, moveMethod);
48}
49
50/////////////////////////
51// CInFile
52
53bool CInFile::Open(const char *name)
54{
55  return CFileBase::OpenBinary(name, O_RDONLY);
56}
57
58bool CInFile::OpenShared(const char *name, bool)
59{
60  return Open(name);
61}
62
63ssize_t CInFile::Read(void *data, size_t size)
64{
65  return read(_handle, data, size);
66}
67
68/////////////////////////
69// COutFile
70
71bool COutFile::Create(const char *name, bool createAlways)
72{
73  if (createAlways)
74  {
75    Close();
76    _handle = ::creat(name, 0666);
77    return _handle != -1;
78  }
79  return OpenBinary(name, O_CREAT | O_EXCL | O_WRONLY);
80}
81
82bool COutFile::Open(const char *name, DWORD creationDisposition)
83{
84  return Create(name, false);
85}
86
87ssize_t COutFile::Write(const void *data, size_t size)
88{
89  return write(_handle, data, size);
90}
91
92}}}
93