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