1 //--- K.I.LIB ---
2 // kl_file.cpp : file operations
3
4 #include "stdafx.h"
5 #include "kilib.h"
6
7 //--------------------------- static --------------------------//
8
9 __int64 kiFile::getSize64( const char* fname )
10 {
11 HANDLE h = ::CreateFile( fname,
12 GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ,
13 NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL );
14 if( h==INVALID_HANDLE_VALUE )
15 return 0;
16
17 DWORD low, hi;
18 low = ::GetFileSize( h, &hi );
19 ::CloseHandle( h );
20
21 return (__int64(hi)<<32) | low;
22 }
23
24 unsigned long kiFile::getSize( const char* fname, unsigned long err )
25 {
26 HANDLE h = ::CreateFile( fname,
27 GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ,
28 NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL );
29 if( h==INVALID_HANDLE_VALUE )
30 return err;
31
32 unsigned long ans = ::GetFileSize( h, NULL );
33 ::CloseHandle( h );
34
35 return ans==0xffffffff ? err : ans;
36 }
37
38 //--------------------------- 結んで開いて --------------------------//
39
40
41 bool kiFile::open( const char* filename, bool read, bool create )
42 {
43 close();
44
45 if( m_bReadMode = read )
46 m_hFile = ::CreateFile( filename,
47 GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
48 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL );
49 else
50 m_hFile = ::CreateFile( filename,
51 GENERIC_WRITE, FILE_SHARE_READ, NULL,
52 create ? CREATE_ALWAYS : OPEN_EXISTING,
53 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL );
54 if( m_hFile == INVALID_HANDLE_VALUE )
55 return false;
56
57 m_nBufPos = 0;
58 if( m_bReadMode )
59 flush();
60
61 return true;
62 }
63
64 void kiFile::close()
65 {
66 if( m_hFile != INVALID_HANDLE_VALUE )
67 {
68 if( !m_bReadMode )
69 flush();
70
71 ::CloseHandle( m_hFile );
72 m_hFile = INVALID_HANDLE_VALUE;
73 }
74 }
75
76
77 //-------------------------- 読み書き ----------------------------//
78
79
80 unsigned long kiFile::read( unsigned char* buf, unsigned long len )
81 {
82 unsigned long ans = 0;
83 if( m_nBufSize!=0 && m_hFile!=INVALID_HANDLE_VALUE && m_bReadMode )
84 {
85 while( (m_nBufSize-m_nBufPos) <= len )
86 {
87 ans += (m_nBufSize-m_nBufPos);
88 ki_memcpy( buf, m_pBuf+m_nBufPos, m_nBufSize-m_nBufPos );
89 len -= (m_nBufSize-m_nBufPos);
90 buf += (m_nBufSize-m_nBufPos);
91
92 flush();
93 if( m_nBufSize == 0 )
94 return ans;
95 }
96 ans += len;
97 ki_memcpy( buf, m_pBuf+m_nBufPos, len );
98 m_nBufPos += len;
99 }
100 return ans;
101 }
102
103 void kiFile::write( const void* buf, unsigned long len )
104 {
105 if( m_hFile==INVALID_HANDLE_VALUE || m_bReadMode )
106 return;
107 const unsigned char* ubuf = (const unsigned char*)buf;
108
109 while( (kifile_bufsize-m_nBufPos) <= len )
110 {
111 ki_memcpy( m_pBuf+m_nBufPos, buf, (kifile_bufsize-m_nBufPos) );
112 len -= (kifile_bufsize-m_nBufPos);
113 ubuf += (kifile_bufsize-m_nBufPos);
114 m_nBufPos = kifile_bufsize;
115 flush();
116 }
117 ki_memcpy( m_pBuf+m_nBufPos, ubuf, len );
118 m_nBufPos += len;
119 }
120
121 #undef putc
122 void kiFile::putc( unsigned char c )
123 {
124 if( m_hFile==INVALID_HANDLE_VALUE || m_bReadMode )
125 return;
126 if( (kifile_bufsize-m_nBufPos) <= 1 )
127 flush();
128 m_pBuf[ m_nBufPos++ ] = c;
129 }
130
131 #undef getc
132 int kiFile::getc()
133 {
134 if( m_nBufSize==0 || m_hFile==INVALID_HANDLE_VALUE || !m_bReadMode )
135 return -1;
136
137 if( 0==(m_nBufSize-m_nBufPos) )
138 {
139 flush();
140 if( m_nBufSize==0 )
141 return -1;
142 }
143 if( 1==(m_nBufSize-m_nBufPos) )
144 {
145 int ans = m_pBuf[ m_nBufPos++ ];
146 flush();
147 return ans;
148 }
149
150 return m_pBuf[ m_nBufPos++ ];
151 }
152
153 void kiFile::flush()
154 {
155 if( m_bReadMode )
156 {
157 ::ReadFile( m_hFile, m_pBuf, kifile_bufsize, &m_nBufSize, NULL );
158 m_nBufPos = 0;
159 }
160 else
161 {
162 ::WriteFile( m_hFile, m_pBuf, m_nBufPos, &m_nBufSize, NULL );
163 m_nBufSize = m_nBufPos = 0;
164 }
165 }