-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFileStream.cpp
More file actions
113 lines (103 loc) · 1.54 KB
/
Copy pathFileStream.cpp
File metadata and controls
113 lines (103 loc) · 1.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Copyright © 2014 CCP ehf.
#include "StdAfx.h"
#include "FileStream.h"
FileStream::FileStream( const wchar_t* filename, Mode mode )
{
#ifdef _WIN32
if( _wfopen_s( &m_file, filename, mode == READ ? L"rb" : L"wb" ) )
{
m_file = nullptr;
}
#else
m_file = fopen( CW2A( filename ), mode == READ ? "rb" : "wb" );
#endif
}
FileStream::~FileStream()
{
if( m_file )
{
fclose( m_file );
}
}
bool FileStream::IsValid() const
{
return m_file != nullptr;
}
ptrdiff_t FileStream::Read( void* dest, ptrdiff_t count )
{
if( m_file )
{
return fread( dest, 1, count < 0 ? GetSize() - GetPosition() : count, m_file );
}
else
{
return -1;
}
}
ptrdiff_t FileStream::Write( const void* source, size_t count )
{
if( m_file )
{
return fwrite( source, 1, count, m_file );
}
else
{
return -1;
}
}
ptrdiff_t FileStream::Seek( ptrdiff_t distance, SeekOrigin method )
{
if( m_file )
{
int origin;
switch( method )
{
case SO_BEGIN:
origin = SEEK_SET;
break;
case SO_CURRENT:
origin = SEEK_CUR;
break;
case SO_END:
origin = SEEK_END;
break;
default:
return -1;
}
if( fseek( m_file, long( distance ), origin ) )
{
return -1;
}
return GetPosition();
}
else
{
return -1;
}
}
ptrdiff_t FileStream::GetPosition()
{
if( m_file )
{
return ftell( m_file );
}
else
{
return -1;
}
}
ptrdiff_t FileStream::GetSize()
{
if( m_file )
{
auto fp = ftell( m_file );
fseek( m_file, 0, SEEK_END );
auto size = ftell( m_file );
fseek( m_file, fp, SEEK_SET );
return size;
}
else
{
return -1;
}
}