📄 filetransferdlg.cpp
字号:
// FileTransferDlg.cpp : implementation file
//
#include "stdafx.h"
#include <process.h>
#include "TestSerialPort2.h"
#include "FileTransferDlg.h"
#include "superSP.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//////////////////////////////////////////////////////////////////////////
// 从磁盘装载文件线程
ULONG WINAPI SendThread(LPVOID lpvoid)
{
CFileTransferDlg* pDlg = (CFileTransferDlg *)lpvoid;
UINT readedByte = 0;
UINT wantByte = 1024;
DWORD dwleftByte;
DWORD dwTotalByte = pDlg->file.GetLength();
dwleftByte = dwTotalByte;
Sleep(100);
LONG thrStatus;
BOOL bExit = false;
while (!bExit)
{
thrStatus = WaitForMultipleObjects(2,
pDlg->hEvent,
false,
INFINITE);
thrStatus -= WAIT_OBJECT_0;
switch(thrStatus)
{
case 0:
bExit = true;
break;
case 1:
{
// 分块读取文件内容,并发送
PACKAGE pack;
if (dwleftByte < 1024)
{
wantByte = dwleftByte;
}
readedByte = pDlg->file.Read(pack.pData, wantByte);
pack.iLen = readedByte;
pack.iType = CSuperSerialPort::emDATA_TYPE_BINARY;
pDlg->pSSP->SendData(&pack);
dwleftByte -= readedByte;
pDlg->PostMessage(WM_UM_SEND_EVENT, (WPARAM)dwleftByte);
// 是否读取到文件尾了
if (dwleftByte <= 0 )
{
bExit = true;
}
else
{
try
{
pDlg->file.Seek(dwTotalByte - dwleftByte, CFile::begin);
}
catch (CFileException e)
{
bExit = true;
}
}
}
break;
default:
break;
}
}
pDlg->file.Close();
pDlg->m_isClose = true;
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CFileTransferDlg dialog
CFileTransferDlg::CFileTransferDlg(CWnd* pParent /*=NULL*/)
: CDialog(CFileTransferDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFileTransferDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CFileTransferDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFileTransferDlg)
DDX_Control(pDX, IDC_PROGRESS_TRANSFER, m_transferProg);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFileTransferDlg, CDialog)
//{{AFX_MSG_MAP(CFileTransferDlg)
ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse)
ON_BN_CLICKED(IDC_BUTTON_SEND, OnButtonSend)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BUTTON_RECEIVE, OnButtonReceive)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_UM_SEND_EVENT, OnDoSendEvent)
ON_MESSAGE(WM_UM_RECEIVE_EVENT, OnDoReceiveEvent)
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////
// 自定义消息处理
void CFileTransferDlg::OnDoSendEvent(WPARAM wParam, LPARAM lParam)
{
m_lCurLeftByte = (long)wParam;
CString str;
str.Format("%d", m_dwFileSize - m_lCurLeftByte);
SetDlgItemText(IDC_EDIT_TRANSFERED_BYTE, str);
if (m_lCurLeftByte == 0)
{
AfxMessageBox("文件传输完毕");
}
}
void CFileTransferDlg::OnDoReceiveEvent(WPARAM wParam, LPARAM lParam)
{
pPACKAGE pPack = (pPACKAGE)wParam;
ASSERT(pPack);
ASSERT(pPack->pData);
if (m_bIsFirstPackage)
{
if (pPack->pData[0] == '$') // 接收到一个$开始
{
m_dwFileSize = atol((char *)pPack->pData+1);
m_bIsFirstPackage = FALSE;
CString fileSize;
fileSize.Format("%.2f", m_dwFileSize/1024.0f);
SetDlgItemText(IDC_EDIT_TRANSFER_BYTE, fileSize);
m_lCurLeftByte = m_dwFileSize;
m_lPreLeftByte = m_dwFileSize;
}
}
else
{
file.Write(pPack->pData, pPack->iLen);
m_lCurReceiveByte += pPack->iLen;
m_lCurLeftByte = m_dwFileSize - m_lCurReceiveByte;
CString str;
str.Format("%d", m_lCurReceiveByte);
SetDlgItemText(IDC_EDIT_TRANSFERED_BYTE, str);
if (m_lCurReceiveByte >= m_dwFileSize)
{
file.Flush();
file.Close();
AfxMessageBox("文件接收完毕");
m_bIsFirstPackage = TRUE;
}
}
delete pPack;
}
/////////////////////////////////////////////////////////////////////////////
// CFileTransferDlg message handlers
void CFileTransferDlg::OnButtonBrowse()
{
if (m_fileCtrl.OpenFileDialog())
{
SetDlgItemText(IDC_EDIT_FILE_PATH,
m_fileCtrl.GetSelectedDir());
}
else
{
AfxMessageBox("文件打开失败,检查文件是否被选中");
}
}
BOOL CFileTransferDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if (pSSP == NULL)
{
AfxMessageBox("串口没被赋予该窗口");
return FALSE;
}
m_transferProg.SetRange(1, 100);
m_transferProg.SetStep(1);
GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(false);
if (IsReceiveDlg)
{
GetDlgItem(IDC_BUTTON_SEND)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_BROWSE)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_RECEIVE)->EnableWindow();
}
else
{
GetDlgItem(IDC_BUTTON_RECEIVE)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_SEND)->EnableWindow();
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CFileTransferDlg::OnButtonSend()
{
CString fileName ;
GetDlgItemText(IDC_EDIT_FILE_PATH, fileName);
if (fileName.IsEmpty())
{
AfxMessageBox("没有选择要传输的文件");
return;
}
CFileException e;
if (!file.Open(fileName,
CFile::modeRead, &e))
{
AfxMessageBox("文件打开失败");
return;
}
DWORD dwfSize;
dwfSize = file.GetLength();
CString fileSize;
fileSize.Format("%.2f", dwfSize/1024.0f);
SetDlgItemText(IDC_EDIT_TRANSFER_BYTE, fileSize);
m_dwFileSize = dwfSize;
m_lCurLeftByte = m_dwFileSize;
m_lPreLeftByte = m_dwFileSize;
hEvent[0] = CreateEvent(NULL, TRUE, FALSE, NULL);
hEvent[1] = CreateEvent(NULL, TRUE, TRUE, NULL);
// 先发送一个要传输文件的长度
PACKAGE pk;
CString strLen;
strLen.Format("$%d", m_dwFileSize);
strcpy((char *)pk.pData, strLen);
pk.iLen = strLen.GetLength();
pSSP->SendData(&pk);
SetTimer(1, 1000, NULL);
DWORD thrId;
hLoadThread = CreateThread(NULL,
0,
SendThread,
this,
0,
&thrId);
SetThreadPriority(hLoadThread,
THREAD_PRIORITY_BELOW_NORMAL);
GetDlgItem(IDC_BUTTON_STOP)->EnableWindow();
}
void CFileTransferDlg::OnTimer(UINT nIDEvent)
{
switch(nIDEvent)
{
case 1:
{
// 每秒传输速度
INT preByte = m_lPreLeftByte - m_lCurLeftByte ;
CString transRate;
transRate.Format(_T("%.2f"), preByte/1024.0f);
SetDlgItemText(IDC_EDIT_TRANSFER_SPEED, transRate);
m_lPreLeftByte = m_lCurLeftByte;
// 传输进度
if (m_dwFileSize != 0)
{
int precent = (m_dwFileSize - m_lCurLeftByte)*100/m_dwFileSize;
m_transferProg.SetPos(precent);
}
// 剩余时间
if (preByte != 0)
{
int leftTime = m_lCurLeftByte/preByte;
SetDlgItemInt(IDC_EDIT_LEFT_TIME, leftTime);
}
else
{
SetDlgItemInt(IDC_EDIT_LEFT_TIME, 0);
}
}
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}
void CFileTransferDlg::OnButtonStop()
{
SetEvent(hEvent[0]);
ResetEvent(hEvent[1]);
GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);
if (IsReceiveDlg)
{
GetDlgItem(IDC_BUTTON_RECEIVE)->EnableWindow();
}
else
{
GetDlgItem(IDC_BUTTON_SEND)->EnableWindow();
}
}
void CFileTransferDlg::OnClose()
{
CloseHandle(hEvent[0]);
CloseHandle(hEvent[1]);
pSSP->CloseFileTransfer(); // 关闭文件接收
CDialog::OnClose();
}
void CFileTransferDlg::OnButtonReceive()
{
CString fileName ;
GetDlgItemText(IDC_EDIT_FILE_PATH, fileName);
if (!fileName.IsEmpty())
{
// 先删除原来的文件
DeleteFile(fileName);
if (file.Open(fileName,
CFile::modeCreate | CFile::modeWrite))
{
pSSP->OpenFileTransfer(this, WM_UM_RECEIVE_EVENT);
m_lCurReceiveByte = 0;
m_bIsFirstPackage = TRUE;
GetDlgItem(IDC_BUTTON_RECEIVE)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON_STOP)->EnableWindow();
SetTimer(1, 1000, NULL);
}
else
{
AfxMessageBox("文件创建失败");
}
}
else
{
AfxMessageBox("输入你要保存的文件类型和目录");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -