2019-01-05 20:21:43 +08:00
|
|
|
|
// FileManager.cpp: implementation of the CFileManager class.
|
|
|
|
|
|
//
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
#include "FileManager.h"
|
2025-04-06 19:35:20 +08:00
|
|
|
|
#include <shellapi.h>
|
2019-01-12 18:21:42 +08:00
|
|
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
|
|
{
|
|
|
|
|
|
DWORD dwSizeHigh;
|
|
|
|
|
|
DWORD dwSizeLow;
|
|
|
|
|
|
}FILESIZE;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
// Construction/Destruction
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
2025-03-13 23:34:33 +08:00
|
|
|
|
CFileManager::CFileManager(CClientSocket *pClient, int h, void* user):CManager(pClient)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
m_nTransferMode = TRANSFER_MODE_NORMAL;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>, <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
|
|
|
|
|
|
SendDriveList();
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
CFileManager::~CFileManager()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_UploadList.clear();
|
|
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2021-03-14 19:54:52 +08:00
|
|
|
|
VOID CFileManager::OnReceive(PBYTE lpBuffer, ULONG nSize)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
switch (lpBuffer[0])
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
case COMMAND_LIST_FILES:// <20><>ȡ<EFBFBD>ļ<EFBFBD><C4BC>б<EFBFBD>
|
|
|
|
|
|
SendFilesList((char *)lpBuffer + 1);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case COMMAND_DELETE_FILE:// ɾ<><C9BE><EFBFBD>ļ<EFBFBD>
|
|
|
|
|
|
DeleteFile((char *)lpBuffer + 1);
|
|
|
|
|
|
SendToken(TOKEN_DELETE_FINISH);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case COMMAND_DELETE_DIRECTORY:// ɾ<><C9BE><EFBFBD>ļ<EFBFBD>
|
|
|
|
|
|
DeleteDirectory((char *)lpBuffer + 1);
|
|
|
|
|
|
SendToken(TOKEN_DELETE_FINISH);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case COMMAND_DOWN_FILES: // <20>ϴ<EFBFBD><CFB4>ļ<EFBFBD>
|
|
|
|
|
|
UploadToRemote(lpBuffer + 1);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case COMMAND_CONTINUE: // <20>ϴ<EFBFBD><CFB4>ļ<EFBFBD>
|
|
|
|
|
|
SendFileData(lpBuffer + 1);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case COMMAND_CREATE_FOLDER:
|
|
|
|
|
|
CreateFolder(lpBuffer + 1);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case COMMAND_RENAME_FILE:
|
|
|
|
|
|
Rename(lpBuffer + 1);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case COMMAND_STOP:
|
|
|
|
|
|
StopTransfer();
|
|
|
|
|
|
break;
|
|
|
|
|
|
case COMMAND_SET_TRANSFER_MODE:
|
|
|
|
|
|
SetTransferMode(lpBuffer + 1);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case COMMAND_FILE_SIZE:
|
|
|
|
|
|
CreateLocalRecvFile(lpBuffer + 1);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case COMMAND_FILE_DATA:
|
|
|
|
|
|
WriteLocalRecvFile(lpBuffer + 1, nSize -1);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case COMMAND_OPEN_FILE_SHOW:
|
|
|
|
|
|
OpenFile((char *)lpBuffer + 1, SW_SHOW);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case COMMAND_OPEN_FILE_HIDE:
|
|
|
|
|
|
OpenFile((char *)lpBuffer + 1, SW_HIDE);
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
bool CFileManager::MakeSureDirectoryPathExists(LPCTSTR pszDirPath)
|
|
|
|
|
|
{
|
|
|
|
|
|
LPTSTR p, pszDirCopy;
|
|
|
|
|
|
DWORD dwAttributes;
|
|
|
|
|
|
|
|
|
|
|
|
// Make a copy of the string for editing.
|
|
|
|
|
|
|
|
|
|
|
|
__try
|
|
|
|
|
|
{
|
|
|
|
|
|
pszDirCopy = (LPTSTR)malloc(sizeof(TCHAR) * (lstrlen(pszDirPath) + 1));
|
|
|
|
|
|
|
|
|
|
|
|
if(pszDirCopy == NULL)
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
|
|
lstrcpy(pszDirCopy, pszDirPath);
|
|
|
|
|
|
|
|
|
|
|
|
p = pszDirCopy;
|
|
|
|
|
|
|
|
|
|
|
|
// If the second character in the path is "\", then this is a UNC
|
|
|
|
|
|
// path, and we should skip forward until we reach the 2nd \ in the path.
|
|
|
|
|
|
|
|
|
|
|
|
if((*p == TEXT('\\')) && (*(p+1) == TEXT('\\')))
|
|
|
|
|
|
{
|
|
|
|
|
|
p++; // Skip over the first \ in the name.
|
|
|
|
|
|
p++; // Skip over the second \ in the name.
|
|
|
|
|
|
|
|
|
|
|
|
// Skip until we hit the first "\" (\\Server\).
|
|
|
|
|
|
|
|
|
|
|
|
while(*p && *p != TEXT('\\'))
|
|
|
|
|
|
{
|
|
|
|
|
|
p = CharNext(p);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Advance over it.
|
|
|
|
|
|
|
|
|
|
|
|
if(*p)
|
|
|
|
|
|
{
|
|
|
|
|
|
p++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Skip until we hit the second "\" (\\Server\Share\).
|
|
|
|
|
|
|
|
|
|
|
|
while(*p && *p != TEXT('\\'))
|
|
|
|
|
|
{
|
|
|
|
|
|
p = CharNext(p);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Advance over it also.
|
|
|
|
|
|
|
|
|
|
|
|
if(*p)
|
|
|
|
|
|
{
|
|
|
|
|
|
p++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(*(p+1) == TEXT(':')) // Not a UNC. See if it's <drive>:
|
|
|
|
|
|
{
|
|
|
|
|
|
p++;
|
|
|
|
|
|
p++;
|
|
|
|
|
|
|
|
|
|
|
|
// If it exists, skip over the root specifier
|
|
|
|
|
|
|
|
|
|
|
|
if(*p && (*p == TEXT('\\')))
|
|
|
|
|
|
{
|
|
|
|
|
|
p++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
while(*p)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(*p == TEXT('\\'))
|
|
|
|
|
|
{
|
|
|
|
|
|
*p = TEXT('\0');
|
|
|
|
|
|
dwAttributes = GetFileAttributes(pszDirCopy);
|
|
|
|
|
|
|
|
|
|
|
|
// Nothing exists with this name. Try to make the directory name and error if unable to.
|
|
|
|
|
|
if(dwAttributes == 0xffffffff)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(!CreateDirectory(pszDirCopy, NULL))
|
|
|
|
|
|
{
|
|
|
|
|
|
if(GetLastError() != ERROR_ALREADY_EXISTS)
|
|
|
|
|
|
{
|
|
|
|
|
|
free(pszDirCopy);
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if((dwAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
|
|
|
|
|
|
{
|
|
|
|
|
|
// Something exists with this name, but it's not a directory... Error
|
|
|
|
|
|
free(pszDirCopy);
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
*p = TEXT('\\');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
p = CharNext(p);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
|
|
|
|
|
{
|
|
|
|
|
|
free(pszDirCopy);
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
free(pszDirCopy);
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CFileManager::OpenFile(LPCTSTR lpFile, INT nShowCmd)
|
|
|
|
|
|
{
|
|
|
|
|
|
char lpSubKey[500];
|
|
|
|
|
|
HKEY hKey;
|
|
|
|
|
|
char strTemp[MAX_PATH];
|
|
|
|
|
|
LONG nSize = sizeof(strTemp);
|
|
|
|
|
|
char *lpstrCat = NULL;
|
|
|
|
|
|
memset(strTemp, 0, sizeof(strTemp));
|
|
|
|
|
|
|
|
|
|
|
|
const char *lpExt = strrchr(lpFile, '.');
|
|
|
|
|
|
if (!lpExt)
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
if (RegOpenKeyEx(HKEY_CLASSES_ROOT, lpExt, 0L, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS)
|
|
|
|
|
|
return false;
|
|
|
|
|
|
RegQueryValue(hKey, NULL, strTemp, &nSize);
|
|
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
|
|
memset(lpSubKey, 0, sizeof(lpSubKey));
|
|
|
|
|
|
wsprintf(lpSubKey, "%s\\shell\\open\\command", strTemp);
|
|
|
|
|
|
|
|
|
|
|
|
if (RegOpenKeyEx(HKEY_CLASSES_ROOT, lpSubKey, 0L, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS)
|
|
|
|
|
|
return false;
|
|
|
|
|
|
memset(strTemp, 0, sizeof(strTemp));
|
|
|
|
|
|
nSize = sizeof(strTemp);
|
|
|
|
|
|
RegQueryValue(hKey, NULL, strTemp, &nSize);
|
|
|
|
|
|
RegCloseKey(hKey);
|
|
|
|
|
|
|
|
|
|
|
|
lpstrCat = strstr(strTemp, "\"%1");
|
|
|
|
|
|
if (lpstrCat == NULL)
|
|
|
|
|
|
lpstrCat = strstr(strTemp, "%1");
|
|
|
|
|
|
|
|
|
|
|
|
if (lpstrCat == NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
lstrcat(strTemp, " ");
|
|
|
|
|
|
lstrcat(strTemp, lpFile);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
lstrcpy(lpstrCat, lpFile);
|
|
|
|
|
|
|
|
|
|
|
|
STARTUPINFO si = {0};
|
|
|
|
|
|
PROCESS_INFORMATION pi;
|
|
|
|
|
|
si.cb = sizeof si;
|
|
|
|
|
|
if (nShowCmd != SW_HIDE)
|
|
|
|
|
|
si.lpDesktop = "WinSta0\\Default";
|
|
|
|
|
|
|
|
|
|
|
|
CreateProcess(NULL, strTemp, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
|
2025-07-16 02:37:33 +08:00
|
|
|
|
CloseHandle(pi.hProcess);
|
|
|
|
|
|
CloseHandle(pi.hThread);
|
2019-01-12 18:21:42 +08:00
|
|
|
|
return true;
|
|
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
UINT CFileManager::SendDriveList()
|
|
|
|
|
|
{
|
|
|
|
|
|
char DriveString[256];
|
|
|
|
|
|
// ǰһ<C7B0><D2BB><EFBFBD>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>52<35>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
BYTE DriveList[1024];
|
|
|
|
|
|
char FileSystem[MAX_PATH];
|
|
|
|
|
|
char *pDrive = NULL;
|
|
|
|
|
|
DriveList[0] = TOKEN_DRIVE_LIST; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
|
|
|
|
|
GetLogicalDriveStrings(sizeof(DriveString), DriveString);
|
|
|
|
|
|
pDrive = DriveString;
|
|
|
|
|
|
|
|
|
|
|
|
unsigned __int64 HDAmount = 0;
|
|
|
|
|
|
unsigned __int64 HDFreeSpace = 0;
|
2024-12-27 01:40:40 +08:00
|
|
|
|
unsigned __int64 AmntMB = 0; // <20>ܴ<EFBFBD>С
|
|
|
|
|
|
unsigned __int64 FreeMB = 0; // ʣ<><CAA3><EFBFBD>ռ<EFBFBD>
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
DWORD dwOffset = 1;
|
|
|
|
|
|
for (; *pDrive != '\0'; pDrive += lstrlen(pDrive) + 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
memset(FileSystem, 0, sizeof(FileSystem));
|
|
|
|
|
|
// <20>õ<EFBFBD><C3B5>ļ<EFBFBD>ϵͳ<CFB5><CDB3>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>С
|
|
|
|
|
|
GetVolumeInformation(pDrive, NULL, 0, NULL, NULL, NULL, FileSystem, MAX_PATH);
|
2024-12-27 01:40:40 +08:00
|
|
|
|
SHFILEINFO sfi = {};
|
2019-01-12 18:21:42 +08:00
|
|
|
|
SHGetFileInfo(pDrive, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);
|
|
|
|
|
|
|
|
|
|
|
|
int nTypeNameLen = lstrlen(sfi.szTypeName) + 1;
|
|
|
|
|
|
int nFileSystemLen = lstrlen(FileSystem) + 1;
|
|
|
|
|
|
|
2019-01-05 20:21:43 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>С
|
2019-01-12 18:21:42 +08:00
|
|
|
|
if (pDrive[0] != 'A' && pDrive[0] != 'B' && GetDiskFreeSpaceEx(pDrive, (PULARGE_INTEGER)&HDFreeSpace, (PULARGE_INTEGER)&HDAmount, NULL))
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
AmntMB = HDAmount / 1024 / 1024;
|
|
|
|
|
|
FreeMB = HDFreeSpace / 1024 / 1024;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
AmntMB = 0;
|
|
|
|
|
|
FreeMB = 0;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
// <20><>ʼ<EFBFBD><CABC>ֵ
|
2019-01-12 18:21:42 +08:00
|
|
|
|
DriveList[dwOffset] = pDrive[0];
|
|
|
|
|
|
DriveList[dwOffset + 1] = GetDriveType(pDrive);
|
|
|
|
|
|
|
2019-01-05 20:21:43 +08:00
|
|
|
|
// <20><><EFBFBD>̿ռ<CCBF><D5BC><EFBFBD><EFBFBD><EFBFBD>ռȥ<D5BC><C8A5>8<EFBFBD>ֽ<EFBFBD>
|
2019-01-12 18:21:42 +08:00
|
|
|
|
memcpy(DriveList + dwOffset + 2, &AmntMB, sizeof(unsigned long));
|
|
|
|
|
|
memcpy(DriveList + dwOffset + 6, &FreeMB, sizeof(unsigned long));
|
|
|
|
|
|
|
2019-01-05 20:21:43 +08:00
|
|
|
|
// <20><><EFBFBD>̾<EFBFBD><CCBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2019-01-12 18:21:42 +08:00
|
|
|
|
memcpy(DriveList + dwOffset + 10, sfi.szTypeName, nTypeNameLen);
|
|
|
|
|
|
memcpy(DriveList + dwOffset + 10 + nTypeNameLen, FileSystem, nFileSystemLen);
|
|
|
|
|
|
|
|
|
|
|
|
dwOffset += 10 + nTypeNameLen + nFileSystemLen;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
2025-08-10 17:15:32 +08:00
|
|
|
|
HttpMask mask(DEFAULT_HOST, m_ClientObject->GetClientIPHeader());
|
|
|
|
|
|
return m_ClientObject->Send2Server((char*)DriveList, dwOffset, &mask);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
UINT CFileManager::SendFilesList(LPCTSTR lpszDirectory)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
// <20><><EFBFBD>ô<EFBFBD><C3B4>䷽ʽ
|
|
|
|
|
|
m_nTransferMode = TRANSFER_MODE_NORMAL;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
UINT nRet = 0;
|
|
|
|
|
|
char strPath[MAX_PATH];
|
|
|
|
|
|
char *pszFileName = NULL;
|
|
|
|
|
|
LPBYTE lpList = NULL;
|
|
|
|
|
|
HANDLE hFile;
|
|
|
|
|
|
DWORD dwOffset = 0; // λ<><CEBB>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
int nLen = 0;
|
|
|
|
|
|
DWORD nBufferSize = 1024 * 10; // <20>ȷ<EFBFBD><C8B7><EFBFBD>10K<30>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
WIN32_FIND_DATA FindFileData;
|
|
|
|
|
|
|
|
|
|
|
|
lpList = (BYTE *)LocalAlloc(LPTR, nBufferSize);
|
2024-12-27 01:40:40 +08:00
|
|
|
|
if (lpList==NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
2019-01-12 18:21:42 +08:00
|
|
|
|
|
|
|
|
|
|
wsprintf(strPath, "%s\\*.*", lpszDirectory);
|
|
|
|
|
|
hFile = FindFirstFile(strPath, &FindFileData);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
|
|
|
|
{
|
|
|
|
|
|
BYTE bToken = TOKEN_FILE_LIST;
|
|
|
|
|
|
return Send(&bToken, 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
*lpList = TOKEN_FILE_LIST;
|
|
|
|
|
|
|
|
|
|
|
|
// 1 Ϊ<><CEAA><EFBFBD>ݰ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>ռ<EFBFBD>ֽ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|
|
|
|
|
dwOffset = 1;
|
|
|
|
|
|
/*
|
|
|
|
|
|
<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1
|
|
|
|
|
|
<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD> strlen(filename) + 1 ('\0')
|
|
|
|
|
|
<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>С 4
|
|
|
|
|
|
*/
|
|
|
|
|
|
do
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><>̬<EFBFBD><CCAC>չ<EFBFBD><D5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (dwOffset > (nBufferSize - MAX_PATH * 2))
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
nBufferSize += MAX_PATH * 2;
|
|
|
|
|
|
lpList = (BYTE *)LocalReAlloc(lpList, nBufferSize, LMEM_ZEROINIT|LMEM_MOVEABLE);
|
2024-12-27 01:40:40 +08:00
|
|
|
|
if (lpList == NULL)
|
|
|
|
|
|
continue;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
2019-01-12 18:21:42 +08:00
|
|
|
|
pszFileName = FindFileData.cFileName;
|
|
|
|
|
|
if (strcmp(pszFileName, ".") == 0 || strcmp(pszFileName, "..") == 0)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
// <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> 1 <20>ֽ<EFBFBD>
|
|
|
|
|
|
*(lpList + dwOffset) = FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
|
|
|
|
|
|
dwOffset++;
|
|
|
|
|
|
// <20>ļ<EFBFBD><C4BC><EFBFBD> lstrlen(pszFileName) + 1 <20>ֽ<EFBFBD>
|
|
|
|
|
|
nLen = lstrlen(pszFileName);
|
|
|
|
|
|
memcpy(lpList + dwOffset, pszFileName, nLen);
|
|
|
|
|
|
dwOffset += nLen;
|
|
|
|
|
|
*(lpList + dwOffset) = 0;
|
|
|
|
|
|
dwOffset++;
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ļ<EFBFBD><C4BC><EFBFBD>С 8 <20>ֽ<EFBFBD>
|
|
|
|
|
|
memcpy(lpList + dwOffset, &FindFileData.nFileSizeHigh, sizeof(DWORD));
|
|
|
|
|
|
memcpy(lpList + dwOffset + 4, &FindFileData.nFileSizeLow, sizeof(DWORD));
|
|
|
|
|
|
dwOffset += 8;
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> 8 <20>ֽ<EFBFBD>
|
|
|
|
|
|
memcpy(lpList + dwOffset, &FindFileData.ftLastWriteTime, sizeof(FILETIME));
|
|
|
|
|
|
dwOffset += 8;
|
|
|
|
|
|
} while(FindNextFile(hFile, &FindFileData));
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
nRet = Send(lpList, dwOffset);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
LocalFree(lpList);
|
|
|
|
|
|
FindClose(hFile);
|
|
|
|
|
|
return nRet;
|
|
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
|
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
bool CFileManager::DeleteDirectory(LPCTSTR lpszDirectory)
|
|
|
|
|
|
{
|
|
|
|
|
|
WIN32_FIND_DATA wfd;
|
|
|
|
|
|
char lpszFilter[MAX_PATH];
|
|
|
|
|
|
|
|
|
|
|
|
wsprintf(lpszFilter, "%s\\*.*", lpszDirectory);
|
|
|
|
|
|
|
|
|
|
|
|
HANDLE hFind = FindFirstFile(lpszFilter, &wfd);
|
|
|
|
|
|
if (hFind == INVALID_HANDLE_VALUE) // <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
|
|
do
|
|
|
|
|
|
{
|
|
|
|
|
|
if (wfd.cFileName[0] != '.')
|
|
|
|
|
|
{
|
|
|
|
|
|
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
|
|
|
|
|
{
|
|
|
|
|
|
char strDirectory[MAX_PATH];
|
|
|
|
|
|
wsprintf(strDirectory, "%s\\%s", lpszDirectory, wfd.cFileName);
|
|
|
|
|
|
DeleteDirectory(strDirectory);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
char strFile[MAX_PATH];
|
|
|
|
|
|
wsprintf(strFile, "%s\\%s", lpszDirectory, wfd.cFileName);
|
|
|
|
|
|
DeleteFile(strFile);
|
|
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
2019-01-12 18:21:42 +08:00
|
|
|
|
} while (FindNextFile(hFind, &wfd));
|
|
|
|
|
|
|
|
|
|
|
|
FindClose(hFind); // <20>رղ<D8B1><D5B2>Ҿ<EFBFBD><D2BE><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
if(!RemoveDirectory(lpszDirectory))
|
|
|
|
|
|
{
|
|
|
|
|
|
return FALSE;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
2019-01-12 18:21:42 +08:00
|
|
|
|
return true;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
UINT CFileManager::SendFileSize(LPCTSTR lpszFileName)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
UINT nRet = 0;
|
|
|
|
|
|
DWORD dwSizeHigh;
|
|
|
|
|
|
DWORD dwSizeLow;
|
|
|
|
|
|
// 1 <20>ֽ<EFBFBD>token, 8<>ֽڴ<D6BD>С, <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>, '\0'
|
|
|
|
|
|
HANDLE hFile;
|
|
|
|
|
|
// <20><><EFBFBD>浱ǰ<E6B5B1><C7B0><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
|
|
|
|
|
memset(m_strCurrentProcessFileName, 0, sizeof(m_strCurrentProcessFileName));
|
|
|
|
|
|
strcpy(m_strCurrentProcessFileName, lpszFileName);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
hFile = CreateFile(lpszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
|
|
|
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
dwSizeLow = GetFileSize(hFile, &dwSizeHigh);
|
|
|
|
|
|
CloseHandle(hFile);
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
int nPacketSize = lstrlen(lpszFileName) + 10;
|
|
|
|
|
|
BYTE *bPacket = (BYTE *)LocalAlloc(LPTR, nPacketSize);
|
2024-12-27 01:40:40 +08:00
|
|
|
|
if (bPacket==NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
2019-01-12 18:21:42 +08:00
|
|
|
|
memset(bPacket, 0, nPacketSize);
|
|
|
|
|
|
|
|
|
|
|
|
bPacket[0] = TOKEN_FILE_SIZE;
|
|
|
|
|
|
FILESIZE *pFileSize = (FILESIZE *)(bPacket + 1);
|
|
|
|
|
|
pFileSize->dwSizeHigh = dwSizeHigh;
|
|
|
|
|
|
pFileSize->dwSizeLow = dwSizeLow;
|
|
|
|
|
|
memcpy(bPacket + 9, lpszFileName, lstrlen(lpszFileName) + 1);
|
|
|
|
|
|
|
|
|
|
|
|
nRet = Send(bPacket, nPacketSize);
|
|
|
|
|
|
LocalFree(bPacket);
|
|
|
|
|
|
return nRet;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
UINT CFileManager::SendFileData(LPBYTE lpBuffer)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2021-03-14 19:54:52 +08:00
|
|
|
|
UINT nRet = 0;
|
2019-01-12 18:21:42 +08:00
|
|
|
|
FILESIZE *pFileSize;
|
|
|
|
|
|
char *lpFileName;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
pFileSize = (FILESIZE *)lpBuffer;
|
|
|
|
|
|
lpFileName = m_strCurrentProcessFileName;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
// Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|
|
|
|
|
if (pFileSize->dwSizeLow == -1)
|
|
|
|
|
|
{
|
|
|
|
|
|
UploadNext();
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
HANDLE hFile;
|
|
|
|
|
|
hFile = CreateFile(lpFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
|
|
|
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
|
|
|
|
return -1;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
SetFilePointer(hFile, pFileSize->dwSizeLow, (long *)&(pFileSize->dwSizeHigh), FILE_BEGIN);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
int nHeadLength = 9; // 1 + 4 + 4<><34><EFBFBD>ݰ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>С
|
|
|
|
|
|
DWORD nNumberOfBytesToRead = MAX_SEND_BUFFER - nHeadLength;
|
|
|
|
|
|
DWORD nNumberOfBytesRead = 0;
|
|
|
|
|
|
|
|
|
|
|
|
LPBYTE lpPacket = (LPBYTE)LocalAlloc(LPTR, MAX_SEND_BUFFER);
|
2024-12-27 01:40:40 +08:00
|
|
|
|
if (lpPacket == NULL)
|
|
|
|
|
|
return -1;
|
2019-01-12 18:21:42 +08:00
|
|
|
|
// Token, <20><>С<EFBFBD><D0A1>ƫ<EFBFBD>ƣ<EFBFBD><C6A3>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
lpPacket[0] = TOKEN_FILE_DATA;
|
|
|
|
|
|
memcpy(lpPacket + 1, pFileSize, sizeof(FILESIZE));
|
|
|
|
|
|
ReadFile(hFile, lpPacket + nHeadLength, nNumberOfBytesToRead, &nNumberOfBytesRead, NULL);
|
|
|
|
|
|
CloseHandle(hFile);
|
|
|
|
|
|
|
|
|
|
|
|
if (nNumberOfBytesRead > 0)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
int nPacketSize = nNumberOfBytesRead + nHeadLength;
|
|
|
|
|
|
nRet = Send(lpPacket, nPacketSize);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
UploadNext();
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
LocalFree(lpPacket);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
return nRet;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD>
|
|
|
|
|
|
void CFileManager::UploadNext()
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2025-04-06 19:35:20 +08:00
|
|
|
|
std::list <std::string>::iterator it = m_UploadList.begin();
|
2019-01-12 18:21:42 +08:00
|
|
|
|
// ɾ<><C9BE>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
m_UploadList.erase(it);
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if(m_UploadList.empty())
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
SendToken(TOKEN_TRANSFER_FINISH);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
2019-01-12 18:21:42 +08:00
|
|
|
|
else
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
// <20>ϴ<EFBFBD><CFB4><EFBFBD>һ<EFBFBD><D2BB>
|
|
|
|
|
|
it = m_UploadList.begin();
|
|
|
|
|
|
SendFileSize((*it).c_str());
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
int CFileManager::SendToken(BYTE bToken)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
return Send(&bToken, 1);
|
|
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
bool CFileManager::UploadToRemote(LPBYTE lpBuffer)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (lpBuffer[lstrlen((char *)lpBuffer) - 1] == '\\')
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
FixedUploadList((char *)lpBuffer);
|
|
|
|
|
|
if (m_UploadList.empty())
|
|
|
|
|
|
{
|
|
|
|
|
|
StopTransfer();
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
m_UploadList.push_back((char *)lpBuffer);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-06 19:35:20 +08:00
|
|
|
|
std::list <std::string>::iterator it = m_UploadList.begin();
|
2019-01-12 18:21:42 +08:00
|
|
|
|
// <20><><EFBFBD>͵<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ļ<EFBFBD>
|
|
|
|
|
|
SendFileSize((*it).c_str());
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
return true;
|
|
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
bool CFileManager::FixedUploadList(LPCTSTR lpPathName)
|
|
|
|
|
|
{
|
2019-01-05 20:21:43 +08:00
|
|
|
|
WIN32_FIND_DATA wfd;
|
2019-01-12 18:21:42 +08:00
|
|
|
|
char lpszFilter[MAX_PATH];
|
|
|
|
|
|
char *lpszSlash = NULL;
|
|
|
|
|
|
memset(lpszFilter, 0, sizeof(lpszFilter));
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
if (lpPathName[lstrlen(lpPathName) - 1] != '\\')
|
|
|
|
|
|
lpszSlash = "\\";
|
|
|
|
|
|
else
|
|
|
|
|
|
lpszSlash = "";
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
wsprintf(lpszFilter, "%s%s*.*", lpPathName, lpszSlash);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
HANDLE hFind = FindFirstFile(lpszFilter, &wfd);
|
|
|
|
|
|
if (hFind == INVALID_HANDLE_VALUE) // <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
do
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
if (wfd.cFileName[0] != '.')
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
|
|
|
|
|
{
|
|
|
|
|
|
char strDirectory[MAX_PATH];
|
|
|
|
|
|
wsprintf(strDirectory, "%s%s%s", lpPathName, lpszSlash, wfd.cFileName);
|
|
|
|
|
|
FixedUploadList(strDirectory);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
char strFile[MAX_PATH];
|
|
|
|
|
|
wsprintf(strFile, "%s%s%s", lpPathName, lpszSlash, wfd.cFileName);
|
|
|
|
|
|
m_UploadList.push_back(strFile);
|
|
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
2019-01-12 18:21:42 +08:00
|
|
|
|
} while (FindNextFile(hFind, &wfd));
|
|
|
|
|
|
|
|
|
|
|
|
FindClose(hFind); // <20>رղ<D8B1><D5B2>Ҿ<EFBFBD><D2BE><EFBFBD>
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
void CFileManager::StopTransfer()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!m_UploadList.empty())
|
|
|
|
|
|
m_UploadList.clear();
|
|
|
|
|
|
SendToken(TOKEN_TRANSFER_FINISH);
|
|
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
void CFileManager::CreateLocalRecvFile(LPBYTE lpBuffer)
|
|
|
|
|
|
{
|
|
|
|
|
|
FILESIZE *pFileSize = (FILESIZE *)lpBuffer;
|
|
|
|
|
|
// <20><><EFBFBD>浱ǰ<E6B5B1><C7B0><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
|
|
|
|
|
|
memset(m_strCurrentProcessFileName, 0, sizeof(m_strCurrentProcessFileName));
|
|
|
|
|
|
strcpy(m_strCurrentProcessFileName, (char *)lpBuffer + 8);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
2019-01-13 13:36:00 +08:00
|
|
|
|
m_nCurrentProcessFileLength = (pFileSize->dwSizeHigh * (MAXDWORD + long long(1))) + pFileSize->dwSizeLow;
|
2019-01-12 18:21:42 +08:00
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
|
|
|
|
|
|
MakeSureDirectoryPathExists(m_strCurrentProcessFileName);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
WIN32_FIND_DATA FindFileData;
|
|
|
|
|
|
HANDLE hFind = FindFirstFile(m_strCurrentProcessFileName, &FindFileData);
|
|
|
|
|
|
|
|
|
|
|
|
if (hFind != INVALID_HANDLE_VALUE
|
|
|
|
|
|
&& m_nTransferMode != TRANSFER_MODE_OVERWRITE_ALL
|
|
|
|
|
|
&& m_nTransferMode != TRANSFER_MODE_ADDITION_ALL
|
|
|
|
|
|
&& m_nTransferMode != TRANSFER_MODE_JUMP_ALL
|
|
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
SendToken(TOKEN_GET_TRANSFER_MODE);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
GetFileData();
|
|
|
|
|
|
}
|
|
|
|
|
|
FindClose(hFind);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
void CFileManager::GetFileData()
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
int nTransferMode;
|
2019-01-12 18:21:42 +08:00
|
|
|
|
switch (m_nTransferMode)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
|
|
|
|
|
case TRANSFER_MODE_OVERWRITE_ALL:
|
|
|
|
|
|
nTransferMode = TRANSFER_MODE_OVERWRITE;
|
|
|
|
|
|
break;
|
2019-01-12 18:21:42 +08:00
|
|
|
|
case TRANSFER_MODE_ADDITION_ALL:
|
|
|
|
|
|
nTransferMode = TRANSFER_MODE_ADDITION;
|
|
|
|
|
|
break;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
case TRANSFER_MODE_JUMP_ALL:
|
2019-01-12 18:21:42 +08:00
|
|
|
|
nTransferMode = TRANSFER_MODE_JUMP;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
break;
|
|
|
|
|
|
default:
|
2019-01-12 18:21:42 +08:00
|
|
|
|
nTransferMode = m_nTransferMode;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
2019-01-12 18:21:42 +08:00
|
|
|
|
|
|
|
|
|
|
WIN32_FIND_DATA FindFileData;
|
|
|
|
|
|
HANDLE hFind = FindFirstFile(m_strCurrentProcessFileName, &FindFileData);
|
|
|
|
|
|
|
|
|
|
|
|
// 1<>ֽ<EFBFBD>Token,<2C><><EFBFBD>ֽ<EFBFBD>ƫ<EFBFBD>Ƹ<EFBFBD><C6B8><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>λ
|
2019-01-05 20:21:43 +08:00
|
|
|
|
BYTE bToken[9];
|
2024-12-27 01:40:40 +08:00
|
|
|
|
DWORD dwCreationDisposition = 0; // <20>ļ<EFBFBD><C4BC><EFBFBD>ʽ
|
2019-01-05 20:21:43 +08:00
|
|
|
|
memset(bToken, 0, sizeof(bToken));
|
|
|
|
|
|
bToken[0] = TOKEN_DATA_CONTINUE;
|
2019-01-12 18:21:42 +08:00
|
|
|
|
|
2019-01-05 20:21:43 +08:00
|
|
|
|
// <20>ļ<EFBFBD><C4BC>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (hFind != INVALID_HANDLE_VALUE)
|
|
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
// <20><>ʾ<EFBFBD><CABE>ʲô
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (nTransferMode == TRANSFER_MODE_ADDITION)
|
|
|
|
|
|
{
|
|
|
|
|
|
memcpy(bToken + 1, &FindFileData.nFileSizeHigh, 4);
|
|
|
|
|
|
memcpy(bToken + 5, &FindFileData.nFileSizeLow, 4);
|
|
|
|
|
|
dwCreationDisposition = OPEN_EXISTING;
|
|
|
|
|
|
}
|
2019-01-05 20:21:43 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD>
|
2019-01-12 18:21:42 +08:00
|
|
|
|
else if (nTransferMode == TRANSFER_MODE_OVERWRITE)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
// ƫ<><C6AB><EFBFBD><EFBFBD>0
|
|
|
|
|
|
memset(bToken + 1, 0, 8);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
// <20><><EFBFBD>´<EFBFBD><C2B4><EFBFBD>
|
2019-01-12 18:21:42 +08:00
|
|
|
|
dwCreationDisposition = CREATE_ALWAYS;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
2019-01-12 18:21:42 +08:00
|
|
|
|
else if (nTransferMode == TRANSFER_MODE_JUMP)
|
2019-01-05 20:21:43 +08:00
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
DWORD dwOffset = -1;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
memcpy(bToken + 5, &dwOffset, 4);
|
|
|
|
|
|
dwCreationDisposition = OPEN_EXISTING;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
// ƫ<><C6AB><EFBFBD><EFBFBD>0
|
|
|
|
|
|
memset(bToken + 1, 0, 8);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
// <20><><EFBFBD>´<EFBFBD><C2B4><EFBFBD>
|
2019-01-12 18:21:42 +08:00
|
|
|
|
dwCreationDisposition = CREATE_ALWAYS;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
FindClose(hFind);
|
|
|
|
|
|
|
|
|
|
|
|
HANDLE hFile =
|
|
|
|
|
|
CreateFile
|
|
|
|
|
|
(
|
2019-01-12 18:21:42 +08:00
|
|
|
|
m_strCurrentProcessFileName,
|
2019-01-05 20:21:43 +08:00
|
|
|
|
GENERIC_WRITE,
|
|
|
|
|
|
FILE_SHARE_WRITE,
|
|
|
|
|
|
NULL,
|
2019-01-12 18:21:42 +08:00
|
|
|
|
dwCreationDisposition,
|
2019-01-05 20:21:43 +08:00
|
|
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
|
|
|
|
0
|
|
|
|
|
|
);
|
|
|
|
|
|
// <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
|
|
|
|
{
|
2019-01-12 18:21:42 +08:00
|
|
|
|
m_nCurrentProcessFileLength = 0;
|
2019-01-05 20:21:43 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
CloseHandle(hFile);
|
|
|
|
|
|
|
2019-01-12 18:21:42 +08:00
|
|
|
|
Send(bToken, sizeof(bToken));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CFileManager::WriteLocalRecvFile(LPBYTE lpBuffer, UINT nSize)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
BYTE *pData;
|
|
|
|
|
|
DWORD dwBytesToWrite;
|
|
|
|
|
|
DWORD dwBytesWrite;
|
|
|
|
|
|
int nHeadLength = 9; // 1 + 4 + 4 <20><><EFBFBD>ݰ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>С<EFBFBD><D0A1>Ϊ<EFBFBD>̶<EFBFBD><CCB6><EFBFBD>9
|
|
|
|
|
|
FILESIZE *pFileSize;
|
|
|
|
|
|
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ݵ<EFBFBD>ƫ<EFBFBD><C6AB>
|
|
|
|
|
|
pData = lpBuffer + 8;
|
|
|
|
|
|
|
|
|
|
|
|
pFileSize = (FILESIZE *)lpBuffer;
|
|
|
|
|
|
|
|
|
|
|
|
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>е<EFBFBD>ƫ<EFBFBD><C6AB>
|
|
|
|
|
|
LONG dwOffsetHigh = pFileSize->dwSizeHigh;
|
|
|
|
|
|
LONG dwOffsetLow = pFileSize->dwSizeLow;
|
|
|
|
|
|
|
|
|
|
|
|
dwBytesToWrite = nSize - 8;
|
|
|
|
|
|
|
|
|
|
|
|
HANDLE hFile =
|
|
|
|
|
|
CreateFile
|
|
|
|
|
|
(
|
|
|
|
|
|
m_strCurrentProcessFileName,
|
|
|
|
|
|
GENERIC_WRITE,
|
|
|
|
|
|
FILE_SHARE_WRITE,
|
|
|
|
|
|
NULL,
|
|
|
|
|
|
OPEN_EXISTING,
|
|
|
|
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
|
|
|
|
0
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
SetFilePointer(hFile, dwOffsetLow, &dwOffsetHigh, FILE_BEGIN);
|
|
|
|
|
|
|
|
|
|
|
|
int nRet = 0;
|
|
|
|
|
|
// д<><D0B4><EFBFBD>ļ<EFBFBD>
|
|
|
|
|
|
nRet = WriteFile
|
|
|
|
|
|
(
|
|
|
|
|
|
hFile,
|
|
|
|
|
|
pData,
|
|
|
|
|
|
dwBytesToWrite,
|
|
|
|
|
|
&dwBytesWrite,
|
|
|
|
|
|
NULL
|
|
|
|
|
|
);
|
|
|
|
|
|
CloseHandle(hFile);
|
|
|
|
|
|
// Ϊ<>˱Ƚϣ<C8BD><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
BYTE bToken[9];
|
|
|
|
|
|
bToken[0] = TOKEN_DATA_CONTINUE;
|
|
|
|
|
|
dwOffsetLow += dwBytesWrite;
|
|
|
|
|
|
memcpy(bToken + 1, &dwOffsetHigh, sizeof(dwOffsetHigh));
|
|
|
|
|
|
memcpy(bToken + 5, &dwOffsetLow, sizeof(dwOffsetLow));
|
|
|
|
|
|
Send(bToken, sizeof(bToken));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CFileManager::SetTransferMode(LPBYTE lpBuffer)
|
|
|
|
|
|
{
|
|
|
|
|
|
memcpy(&m_nTransferMode, lpBuffer, sizeof(m_nTransferMode));
|
|
|
|
|
|
GetFileData();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CFileManager::CreateFolder(LPBYTE lpBuffer)
|
|
|
|
|
|
{
|
|
|
|
|
|
MakeSureDirectoryPathExists((char *)lpBuffer);
|
|
|
|
|
|
SendToken(TOKEN_CREATEFOLDER_FINISH);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CFileManager::Rename(LPBYTE lpBuffer)
|
|
|
|
|
|
{
|
|
|
|
|
|
LPCTSTR lpExistingFileName = (char *)lpBuffer;
|
|
|
|
|
|
LPCTSTR lpNewFileName = lpExistingFileName + lstrlen(lpExistingFileName) + 1;
|
|
|
|
|
|
::MoveFile(lpExistingFileName, lpNewFileName);
|
|
|
|
|
|
SendToken(TOKEN_RENAME_FINISH);
|
2019-01-05 20:21:43 +08:00
|
|
|
|
}
|