localview.cpp
来自「这是主要完成文件上传功能,对要写ftp程序者是一个好的参考源码」· C++ 代码 · 共 449 行
CPP
449 行
// LocalView.cpp : implementation file
//
#include "stdafx.h"
#include "EasyFtp.h"
#include "LocalView.h"
#include "mainfrm.h"
#include "MessageView.h"
#include "WorkView.h"
#include "io.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
LV_ITEM lvi;
extern volatile bool bExitApp;
CLocalView *pLocalView;
extern CMessageView *pMessageView;
CWinThread *MySerchDirThread;
UINT MySerchDirThreadFunction(LPVOID lpParam);
//void MySerchDirThreadEnd(void);
bool AddOneDir(char *cPath, char *cBasePath);
bool bAddDir=true; //允许加入
extern bool bAutoLoad;
extern bool bCmpNow;
extern int iNowProjectNo;
extern CMainFrame *pMainFrame;
extern CWorkView *pWorkView;
extern char sProjectAttrib[256][6][256];
int iTotalLocalFile=0;
int iTotalLocalDir=0;
DWORD dwTotalLocalFileLong=0;
/////////////////////////////////////////////////////////////////////////////
// CLocalView
IMPLEMENT_DYNCREATE(CLocalView, CFormView)
CLocalView::CLocalView()
: CFormView(CLocalView::IDD)
{
//{{AFX_DATA_INIT(CLocalView)
m_Localpath = _T("");
//}}AFX_DATA_INIT
m_hPostEvent=NULL;
pLocalView=this;
}
CLocalView::~CLocalView()
{
if(m_hPostEvent)
{
CloseHandle(m_hPostEvent);
m_hPostEvent=NULL;
}
pLocalView=NULL;
//MySerchDirThreadEnd();
}
void CLocalView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLocalView)
DDX_Control(pDX, IDC_LOCAL_BROWS, m_LocalButton);
DDX_Control(pDX, IDC_LOCAL_PATH, m_LocalPath);
DDX_Control(pDX, IDC_LOCAL_LIST, m_LocalList);
DDX_Text(pDX, IDC_LOCAL_PATH, m_Localpath);
DDV_MaxChars(pDX, m_Localpath, 256);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CLocalView, CFormView)
//{{AFX_MSG_MAP(CLocalView)
ON_WM_SIZE()
ON_BN_CLICKED(IDC_LOCAL_BROWS, OnLocalBrows)
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_MY_LOCALLIST_INSERT,OnLocalInsert)
ON_MESSAGE(WM_MY_PROJECT_PATH,OnProjectPath)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLocalView diagnostics
#ifdef _DEBUG
void CLocalView::AssertValid() const
{
CFormView::AssertValid();
}
void CLocalView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLocalView message handlers
void CLocalView::OnDraw(CDC* pDC)
{
// TODO: Add your specialized code here and/or call the base class
//AfxMessageBox("OK");
}
void CLocalView::OnSize(UINT nType, int cx, int cy)
{
// CFormView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(m_LocalPath.m_hWnd)
m_LocalPath.SetWindowPos(this,0,0,cx-80,20,SWP_NOZORDER|SWP_NOMOVE);
if(m_LocalButton.m_hWnd)
m_LocalButton.SetWindowPos(this,cx-80,0,80,20,SWP_NOZORDER);
if(m_LocalList.m_hWnd)
{
m_LocalList.ShowWindow(SW_HIDE);
m_LocalList.SetWindowPos(this,0,0,cx,cy-20,SWP_NOZORDER|SWP_NOMOVE);
m_LocalList.ShowWindow(SW_SHOW);
} //调整大小
}
void CLocalView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
RECT rct;
GetClientRect(&rct); //得到客户区域大小
if(m_LocalPath.m_hWnd)
m_LocalPath.SetWindowPos(this,0,0,rct.right-80,20,SWP_NOZORDER|SWP_NOMOVE);
if(m_LocalButton.m_hWnd)
m_LocalButton.SetWindowPos(this,rct.right-80,0,80,20,SWP_NOZORDER);
if(m_LocalList.m_hWnd)
{
m_LocalList.ShowWindow(SW_HIDE);
m_LocalList.SetWindowPos(this,0,0,rct.right,rct.bottom-20,SWP_NOZORDER|SWP_NOMOVE);
m_LocalList.ShowWindow(SW_SHOW);
} //初始化大小
//******************
//填写列表名
static struct
{
LPSTR pszText;
int uiFormat;
}columns[]={
_T("本地文件名称"),LVCFMT_LEFT,
_T("文件日期"),LVCFMT_CENTER,
_T("文件大小"),LVCFMT_RIGHT,
_T("文件目录"),LVCFMT_LEFT,
_T("状态"),LVCFMT_CENTER
};
int j;
for(int i=0;i<sizeof(columns)/sizeof(columns[0]);i++)
{
switch(i)
{
case 0:
j=100;
break;
case 1:
j=100;
break;
case 2:
j=60;
break;
case 3:
j=60;
break;
default:
j=50;
break;
}
m_LocalList.InsertColumn(i,columns[i].pszText,columns[i].uiFormat,j);
}
m_LocalList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
//画出框格
}
void CLocalView::OnLocalBrows()
{
// TODO: Add your control notification handler code here
if(!bAddDir)
return;
char pszDisplayName[256];
bool bYes=false;
BROWSEINFO BrowseInfo;
LPITEMIDLIST pidlBrowse;
LPMALLOC pMalloc;
if( !SUCCEEDED(SHGetMalloc(&pMalloc)) )
return ;
BrowseInfo.hwndOwner = m_hWnd;
BrowseInfo.pidlRoot = NULL;
BrowseInfo.pszDisplayName = pszDisplayName;
BrowseInfo.lpszTitle = "请指定一个目录:";
BrowseInfo.ulFlags = BIF_DONTGOBELOWDOMAIN;
BrowseInfo.lpfn = NULL;
BrowseInfo.lParam = 0;
BrowseInfo.iImage = 0;
pidlBrowse = SHBrowseForFolder(&BrowseInfo);
char temp[256];
bYes=false;
if( pidlBrowse!=NULL )
{
if( SHGetPathFromIDList(pidlBrowse,pszDisplayName) )
{
//m_Ed1 = pszDisplayName;
strcpy(temp,pszDisplayName);
bYes=true;
bAddDir=false; //禁止再次添加
((CButton *)GetDlgItem(IDC_LOCAL_BROWS))->EnableWindow(false);
}
pMalloc->Free(pidlBrowse);
}
pMalloc->Release();
if(bYes) //选定
{
bExitApp=false;
m_Localpath.Format("%s",temp);
if(m_LocalList.GetItemCount()>0)
{
m_LocalList.DeleteAllItems();
}
strcpy(sProjectAttrib[iNowProjectNo][5],temp);
pMainFrame->PostMessage(WM_MY_PROJECT_UPDATE);
strcpy((char *)m_csSerchBase,temp);
UpdateData(false);
if((MySerchDirThread = AfxBeginThread(MySerchDirThreadFunction,0)) == NULL)
{
//建立失败处理
return;
}
else //函数会建立一个辅助线程并暂时将其挂起。
{
MySerchDirThread->SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
MySerchDirThread->ResumeThread();//调用CWinThread:: ResumeThread使线程开始运行
}
}
}
void CLocalView::OnLocalInsert(WPARAM wParam, LPARAM lParam)
{
lvi.iItem=m_LocalList.GetItemCount();
lvi.pszText="";
lvi.lParam=(LPARAM)lvi.iItem;
m_LocalList.InsertItem(&lvi);
m_LocalList.SetItemText(lvi.iItem,0,(char *)m_csName);
m_LocalList.SetItemText(lvi.iItem,1,(char *)m_csTime);
m_LocalList.SetItemText(lvi.iItem,2,(char *)m_csSize);
m_LocalList.SetItemText(lvi.iItem,3,(char *)m_csPath);
m_LocalList.SetItemText(lvi.iItem,4,(char *)m_csAttrib);
m_LocalList.SetHotItem(lvi.iItem); //标注当前项目
m_LocalList.EnsureVisible(lvi.iItem,true); //滚动影响的卷轴
m_LocalList.Update(lvi.iItem); //重绘List界面,防止花屏
SetEvent(m_hPostEvent); //允许再次加入
}
UINT MySerchDirThreadFunction(LPVOID lpParam)
{
iTotalLocalFile=0;
iTotalLocalDir=0;
dwTotalLocalFileLong=0;
AddOneDir((char*)pLocalView->m_csSerchBase,(char*)pLocalView->m_csSerchBase);
CString te;
te.Format("查找完成,文件:%d个、目录:%d个、共%ld字节\r\n",
iTotalLocalFile,iTotalLocalDir,dwTotalLocalFileLong);
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)te);
bAddDir=true; //禁止再次添加
((CButton *)pLocalView->GetDlgItem(IDC_LOCAL_BROWS))->EnableWindow(true);
if(bAutoLoad)//自动则开始检查网络情况
{
pMainFrame->PostMessage(WM_MY_AUTO_LINK);//OnButton1();
}
else//不是自动模式,看是否为比较模式
{
if(bCmpNow)
{
bCmpNow=false;
pWorkView->PostMessage(WM_MY_WORK_LISTNEW);
}
}
return true;
}
bool AddOneDir(char cPath[256], char cBasePath[256])
{
struct tm *thefiletime;
long dofile=0;
struct _finddata_t bFile;
char temp1[256];//当前路径
char temp2[256];//找到的文件名
char temp3[256];//保存的原始路径
char temp4[256];//目录属性
char *pTemp; //字符串指针
int done=0;
CString te;
strcpy(temp1,cPath); //得到当前目录存入temp1
int i=strlen(temp1);
if(temp1[i-1]!='\\')
{
temp1[i]='\\';
temp1[i+1]=0x00;
}
if(strlen(temp1)==strlen(cPath)+1)
{
strcat(cBasePath,"\\");
}
if(strcmp(cPath,cBasePath)==0)
{
strcpy(temp4,"");
}
else
{
strcpy(temp4,cPath);
pTemp=cPath;
pTemp+=strlen(cBasePath);
strcpy(temp4,pTemp);
}
strcpy(temp3,temp1);
strcat(temp1,"*.*"); //在当前目录下查找*.*
dofile=_findfirst(temp1,&bFile);
if(dofile==-1)//目录文件失败
{
AfxMessageBox("查找目录失败!");
return false;//break;
}
done=0;
while(done!=-1)
{
if(bExitApp)
{
return false;
}
//loopmessage();
strcpy(temp2,bFile.name);//找到的文件名写入temp2
if(bFile.attrib&_A_SUBDIR)//strcmp(temp2,".")==0||strcmp(temp2,"..")==0)
{
if(strcmp(temp2,".")==0||strcmp(temp2,"..")==0)
{
done=_findnext(dofile,&bFile);
continue;///如果是.和..子目录,跳到下一个
}//找到子目录
iTotalLocalDir+=1;
strcpy(temp1,temp3);
strcat(temp1,bFile.name);
strcat(temp1,"\\");
if(AddOneDir(temp1,cBasePath)==false)
{
//AfxMessageBox("查找失败!");
return false;
}
}
else //是文件,则添加
{
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"加入文件:");
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)temp2);
iTotalLocalFile+=1;
dwTotalLocalFileLong+=bFile.size;
strcpy((char *)pLocalView->m_csAttrib,"未知");
strcpy((char *)pLocalView->m_csName,temp2);
strcpy((char *)pLocalView->m_csPath,temp4);
thefiletime=localtime(&(bFile.time_write));
if(thefiletime!=NULL)
{
te.Format("%04d-%02d-%02d %02d:%02d",thefiletime->tm_year+1900,thefiletime->tm_mon+1,thefiletime->tm_mday,thefiletime->tm_hour,thefiletime->tm_min);
strcpy((char *)pLocalView->m_csTime,te);
}
else
{
strcpy((char *)pLocalView->m_csTime,"无效的时间"); //显示时间
}
te.Format("%d",bFile.size);
strcpy((char *)pLocalView->m_csSize,te);
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"\r\n");
ResetEvent(pLocalView->m_hPostEvent);
pLocalView->PostMessage(WM_MY_LOCALLIST_INSERT,0,0);
if(WaitForSingleObject(pLocalView->m_hPostEvent,0xffffffff)==WAIT_TIMEOUT)
{
pMessageView->PostMessage(WM_MY_MESSAGE_UPDATE,0,(LPARAM)(LPCTSTR)"等待本地列表超时..");
}
}
done=_findnext(dofile,&bFile);
//文件加入,找下一个文件
}
return true;
}
BOOL CLocalView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
return CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}
void CLocalView::OnProjectPath(WPARAM wParam, LPARAM lParam)
{
if(!bAddDir)
return;
bAddDir=false;
char sPath[256];
strcpy(sPath,(char*)lParam);
// bExitApp=false;
m_Localpath.Format("%s",sPath);
if(m_LocalList.GetItemCount()>0)
{
m_LocalList.DeleteAllItems();
}
UpdateData(false);
strcpy((char *)m_csSerchBase,sPath);
if((MySerchDirThread = AfxBeginThread(MySerchDirThreadFunction,0)) == NULL)
{
//建立失败处理
return;
}
else //函数会建立一个辅助线程并暂时将其挂起。
{
MySerchDirThread->SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
MySerchDirThread->ResumeThread();//调用CWinThread:: ResumeThread使线程开始运行
}
}
int CLocalView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFormView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
if((m_hPostEvent=CreateEvent(NULL,TRUE,TRUE,NULL))==NULL)
return -1;
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?