1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file.
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/fxcrt/fx_ext.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "fxcrt_windows.h"
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL FX_File_Exist(FX_BSTR fileName)
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwAttri = ::GetFileAttributesA(fileName.GetCStr());
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (dwAttri == -1) {
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (dwAttri & FILE_ATTRIBUTE_DIRECTORY) == 0;
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL FX_File_Exist(FX_WSTR fileName)
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwAttri = ::GetFileAttributesW((LPCWSTR)fileName.GetPtr());
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (dwAttri == -1) {
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (dwAttri & FILE_ATTRIBUTE_DIRECTORY) == 0;
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIFXCRT_FileAccess* FXCRT_FileAccess_Create(IFX_Allocator* pAllocator)
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pAllocator) {
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FX_NewAtAllocator(pAllocator) CFXCRT_FileAccess_Win64;
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FX_NEW CFXCRT_FileAccess_Win64;
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid FXCRT_Windows_GetFileMode(FX_DWORD dwMode, FX_DWORD &dwAccess, FX_DWORD &dwShare, FX_DWORD &dwCreation)
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    dwAccess = GENERIC_READ;
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    dwShare = FILE_SHARE_READ | FILE_SHARE_WRITE;
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!(dwMode & FX_FILEMODE_ReadOnly)) {
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dwAccess |= GENERIC_WRITE;
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dwCreation = (dwMode & FX_FILEMODE_Truncate) ? CREATE_ALWAYS : OPEN_ALWAYS;
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        dwCreation = OPEN_EXISTING;
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern "C" {
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovWINBASEAPI BOOL WINAPI GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize);
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovWINBASEAPI BOOL WINAPI SetFilePointerEx(HANDLE hFile, LARGE_INTEGER liDistanceToMove, PLARGE_INTEGER lpNewFilePointer, DWORD dwMoveMethod);
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef __cplusplus
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFXCRT_FileAccess_Win64::CFXCRT_FileAccess_Win64()
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    : m_hFile(NULL)
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFXCRT_FileAccess_Win64::~CFXCRT_FileAccess_Win64()
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Close();
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CFXCRT_FileAccess_Win64::Open(FX_BSTR fileName, FX_DWORD dwMode)
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_hFile) {
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwAccess, dwShare, dwCreation;
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation);
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_hFile = ::CreateFileA(fileName.GetCStr(), dwAccess, dwShare, NULL, dwCreation, FILE_ATTRIBUTE_NORMAL, NULL);
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_hFile == INVALID_HANDLE_VALUE) {
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_hFile = NULL;
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_hFile != NULL;
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CFXCRT_FileAccess_Win64::Open(FX_WSTR fileName, FX_DWORD dwMode)
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_hFile) {
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FX_DWORD dwAccess, dwShare, dwCreation;
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation);
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_hFile = ::CreateFileW((LPCWSTR)fileName.GetPtr(), dwAccess, dwShare, NULL, dwCreation, FILE_ATTRIBUTE_NORMAL, NULL);
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (m_hFile == INVALID_HANDLE_VALUE) {
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        m_hFile = NULL;
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return m_hFile != NULL;
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFXCRT_FileAccess_Win64::Close()
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_hFile) {
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return;
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ::CloseHandle(m_hFile);
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    m_hFile = NULL;
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CFXCRT_FileAccess_Win64::Release(IFX_Allocator* pAllocator)
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pAllocator) {
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        FX_DeleteAtAllocator(this, pAllocator, CFXCRT_FileAccess_Win64);
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    } else {
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        delete this;
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FILESIZE CFXCRT_FileAccess_Win64::GetSize() const
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_hFile) {
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    LARGE_INTEGER size = {0, 0};
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!::GetFileSizeEx(m_hFile, &size)) {
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (FX_FILESIZE)size.QuadPart;
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FILESIZE CFXCRT_FileAccess_Win64::GetPosition() const
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_hFile) {
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (FX_FILESIZE) - 1;
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    LARGE_INTEGER dist = {0, 0};
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    LARGE_INTEGER newPos = {0, 0};
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_CURRENT)) {
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (FX_FILESIZE) - 1;
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (FX_FILESIZE)newPos.QuadPart;
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FILESIZE CFXCRT_FileAccess_Win64::SetPosition(FX_FILESIZE pos)
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_hFile) {
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (FX_FILESIZE) - 1;
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    LARGE_INTEGER dist;
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    dist.QuadPart = pos;
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    LARGE_INTEGER newPos = {0, 0};
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!::SetFilePointerEx(m_hFile, dist, &newPos, FILE_BEGIN)) {
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (FX_FILESIZE) - 1;
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return (FX_FILESIZE)newPos.QuadPart;
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovsize_t CFXCRT_FileAccess_Win64::Read(void* pBuffer, size_t szBuffer)
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_hFile) {
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    size_t szRead = 0;
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!::ReadFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szRead, NULL)) {
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return szRead;
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovsize_t CFXCRT_FileAccess_Win64::Write(const void* pBuffer, size_t szBuffer)
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_hFile) {
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    size_t szWrite = 0;
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!::WriteFile(m_hFile, pBuffer, (DWORD)szBuffer, (LPDWORD)&szWrite, NULL)) {
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return szWrite;
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovsize_t CFXCRT_FileAccess_Win64::ReadPos(void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_hFile) {
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (pos >= GetSize()) {
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (SetPosition(pos) == (FX_FILESIZE) - 1) {
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return Read(pBuffer, szBuffer);
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovsize_t CFXCRT_FileAccess_Win64::WritePos(const void* pBuffer, size_t szBuffer, FX_FILESIZE pos)
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_hFile) {
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (SetPosition(pos) == (FX_FILESIZE) - 1) {
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return 0;
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return Write(pBuffer, szBuffer);
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CFXCRT_FileAccess_Win64::Flush()
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (!m_hFile) {
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ::FlushFileBuffers(m_hFile);
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CFXCRT_FileAccess_Win64::Truncate(FX_FILESIZE szFile)
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (SetPosition(szFile) == (FX_FILESIZE) - 1) {
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return FALSE;
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ::SetEndOfFile(m_hFile);
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL FX_File_Delete(FX_BSTR fileName)
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ::DeleteFileA(fileName.GetCStr());
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL FX_File_Delete(FX_WSTR fileName)
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ::DeleteFileW((LPCWSTR)fileName.GetPtr());
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ::CopyFileA(fileNameSrc.GetCStr(), fileNameDst.GetCStr(), FALSE);
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ::CopyFileW((LPCWSTR)fileNameSrc.GetPtr(), (LPCWSTR)fileNameDst.GetPtr(), FALSE);
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst)
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ::MoveFileA(fileNameSrc.GetCStr(), fileNameDst.GetCStr());
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst)
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return ::MoveFileW((LPCWSTR)fileNameSrc.GetPtr(), (LPCWSTR)fileNameDst.GetPtr());
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
223