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 
12 namespace NC {
13 namespace NFile {
14 namespace NIO {
15 
OpenBinary(const char * name,int flags)16 bool 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 
Close()26 bool 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 
GetLength(UInt64 & length) const36 bool 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 
Seek(off_t distanceToMove,int moveMethod) const45 off_t CFileBase::Seek(off_t distanceToMove, int moveMethod) const
46 {
47   return ::lseek(_handle, distanceToMove, moveMethod);
48 }
49 
50 /////////////////////////
51 // CInFile
52 
Open(const char * name)53 bool CInFile::Open(const char *name)
54 {
55   return CFileBase::OpenBinary(name, O_RDONLY);
56 }
57 
OpenShared(const char * name,bool)58 bool CInFile::OpenShared(const char *name, bool)
59 {
60   return Open(name);
61 }
62 
Read(void * data,size_t size)63 ssize_t CInFile::Read(void *data, size_t size)
64 {
65   return read(_handle, data, size);
66 }
67 
68 /////////////////////////
69 // COutFile
70 
Create(const char * name,bool createAlways)71 bool 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 
Open(const char * name,DWORD creationDisposition)82 bool COutFile::Open(const char *name, DWORD creationDisposition)
83 {
84   return Create(name, false);
85 }
86 
Write(const void * data,size_t size)87 ssize_t COutFile::Write(const void *data, size_t size)
88 {
89   return write(_handle, data, size);
90 }
91 
92 }}}
93