6 #ifndef USE_WINDOWS_FILE
24 #define kChunkSizeMax (1 << 22)
29 #ifdef USE_WINDOWS_FILE
30 p->handle = INVALID_HANDLE_VALUE;
36 #if !defined(UNDER_CE) || !defined(USE_WINDOWS_FILE)
38 #ifdef USE_WINDOWS_FILE
39 p->handle = CreateFileA(
name,
43 writeMode ? CREATE_ALWAYS : OPEN_EXISTING,
44 FILE_ATTRIBUTE_NORMAL,
46 return (
p->handle != INVALID_HANDLE_VALUE) ? 0 : GetLastError();
49 return (
p->file !=
nullptr) ? 0 :
62 #ifdef USE_WINDOWS_FILE
64 p->handle = CreateFileW(
name,
68 writeMode ? CREATE_ALWAYS : OPEN_EXISTING,
69 FILE_ATTRIBUTE_NORMAL,
71 return (
p->handle != INVALID_HANDLE_VALUE) ? 0 : GetLastError();
78 #ifdef USE_WINDOWS_FILE
79 if (
p->handle != INVALID_HANDLE_VALUE) {
80 if (!CloseHandle(
p->handle))
81 return GetLastError();
82 p->handle = INVALID_HANDLE_VALUE;
85 if (
p->file !=
nullptr) {
86 int res = fclose(
p->file);
96 size_t originalSize = *
size;
97 if (originalSize == 0)
100 #ifdef USE_WINDOWS_FILE
104 DWORD curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : (DWORD)originalSize;
106 BOOL
res = ReadFile(
p->handle,
data, curSize, &processed,
NULL);
108 originalSize -= processed;
111 return GetLastError();
114 }
while (originalSize > 0);
119 *
size = fread(
data, 1, originalSize,
p->file);
120 if (*
size == originalSize)
122 return ferror(
p->file);
128 size_t originalSize = *
size;
129 if (originalSize == 0)
132 #ifdef USE_WINDOWS_FILE
136 DWORD curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : (DWORD)originalSize;
138 BOOL
res = WriteFile(
p->handle,
data, curSize, &processed,
NULL);
140 originalSize -= processed;
143 return GetLastError();
146 }
while (originalSize > 0);
151 *
size = fwrite(
data, 1, originalSize,
p->file);
152 if (*
size == originalSize)
154 return ferror(
p->file);
160 #ifdef USE_WINDOWS_FILE
168 moveMethod = FILE_BEGIN;
171 moveMethod = FILE_CURRENT;
174 moveMethod = FILE_END;
177 return ERROR_INVALID_PARAMETER;
179 value.LowPart = SetFilePointer(
p->handle,
value.LowPart, &
value.HighPart, moveMethod);
180 if (
value.LowPart == 0xFFFFFFFF) {
194 moveMethod = SEEK_SET;
197 moveMethod = SEEK_CUR;
200 moveMethod = SEEK_END;
205 res = fseek(
p->file, (
long)*
pos, moveMethod);
206 *
pos = ftell(
p->file);
213 #ifdef USE_WINDOWS_FILE
216 DWORD sizeLow = GetFileSize(
p->handle, &sizeHigh);
217 if (sizeLow == 0xFFFFFFFF) {
218 DWORD
res = GetLastError();
222 *length = (((
UInt64)sizeHigh) << 32) + sizeLow;
227 long pos = ftell(
p->file);
228 int res = fseek(
p->file, 0, SEEK_END);
229 *length = ftell(
p->file);
230 fseek(
p->file,
pos, SEEK_SET);