⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webdiskwnd.cpp

📁 网络硬盘的客户段,网络硬盘的客户段网络硬盘的客户段网络硬盘的客户段
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		
		m_pdtcFile->DeleteItem(ChildItem);
	}

	//strFileNameBunch(文件名串如下排列,中间用'|'分隔
    //strFileNameBunch = "123.111|asd.ttt|";

	int strLen = strFileNameBunch.GetLength();
	CString strFileName;
	
	int i, j;

	for(i=0; i<strLen;)
	{
		j = strFileNameBunch.Find('|', i);
		strFileName = strFileNameBunch.Mid(i, j-i);
		if((strFileName.Left(1)).Compare(_T("@")) == 0)
		{
			//"@\建立科技\kjkjk"



			int index = strFileName.ReverseFind('\\');
			CString str = strFileName.Mid(index+1);
			str.Replace("@","");

			HTREEITEM ChildItem1;
			ChildItem1 = m_pdtcFile->InsertItem(_T(str), 0, 0, root);
//			ChildItem1 = m_pdtcFile->InsertItem(NULL, str, 0, 0, NULL, NULL, (LPARAM)p, root, NULL);

			RetrieveShareFileList(ChildItem1);
		}
		else
		{
			m_pdtcFile->InsertItem(_T(strFileName), 1, 1, root);
		}

		i=j+1;

	}


	m_pdtcFile->Expand(root, TVE_EXPAND);
	SysFreeString(bstrRootPth);
#if 0
	//删除root下的所有节点
	if (m_pdtcFile->ItemHasChildren(root))
	{
		HTREEITEM hNextItem;
		HTREEITEM hChildItem = m_pdtcFile->GetChildItem(root);

		while (hChildItem != NULL)
		{
			hNextItem = m_pdtcFile->GetNextItem(hChildItem, TVGN_NEXT);
			m_pdtcFile->DeleteItem(hChildItem);
			hChildItem = hNextItem;
		}
	}

	//共享文件夹
	BSTR bstShareUser = ::SysAllocString(NULL);
	CString stShareUser;

	m_pService->ShowShare(m_bstrTicket, &bstShareUser);
	stShareUser = _com_util::ConvertBSTRToString(bstShareUser);

	int i, j;
	CString strSingleUser;
	CString strU, strF;
	//"\个人助理|zzjj*\我的图片\yyy|lyt*\个人助理|zzjj"

	for(i=0; i<stShareUser.GetLength();)
	{
		HTREEITEM ChildUser, ChildFolder;
		j = stShareUser.Find('*', i);
		strSingleUser = stShareUser.Mid(i, j-i);

		int m=0, n=0;
		n = strSingleUser.Find('|', m);
		strF = strSingleUser.Mid(m, n-m);

		m = n+1;
		strU = strSingleUser.Mid(m, strSingleUser.GetLength()-m);

		HTREEITEM RetItem = FindChildItem(m_pdtcFile, root, strU);

		if(RetItem == NULL)
		{
			ChildUser = m_pdtcFile->InsertItem(strU, 0, 0, root);
		}
		else
		{
			ChildUser = RetItem;
		}
		ChildFolder = m_pdtcFile->InsertItem(strF, 0, 0, ChildUser);

		CString strTemp;
		strTemp.Format("%s%s", strU, strF);
		BSTR bstUser;
		bstUser = strTemp.AllocSysString();
		BSTR bstRet = ::SysAllocString(NULL);

		m_pService->GetShareFile(m_bstrTicket, bstUser, &bstRet);

		strTemp = ::_com_util::ConvertBSTRToString(bstRet);

		for(int x=0,y=0; x<strTemp.GetLength();)
		{
			CString strFile;
			y = strTemp.Find('|', x);
			strFile = strTemp.Mid(x, y-x);
			m_pdtcFile->InsertItem(strFile, 1, 1, ChildFolder);

			x = y+1;

		}
		::SysFreeString(bstUser);
		::SysFreeString(bstRet);



//		m_pdtcFile->GetChildItem 
		




/*		if((strFileName.Left(1)).Compare(_T("@")) == 0)
		{
			CString str = strFileName.Mid(1);
			HTREEITEM ChildItem1;
			ChildItem1 = m_pdtcFile->InsertItem(_T(str), 0, 0, root);
			RetrieveFileList(ChildItem1);
		}
		else
		{
			m_pdtcFile->InsertItem(_T(strFileName), 1, 1, root);
		}
*/
		i=j+1;
	}
	::SysFreeString(bstShareUser);

#endif

}

void CWebDiskWnd::OnDblclkTreeTest(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	HTREEITEM hTreeItem = m_pdtcFile->GetSelectedItem();

	CString str = m_pdtcFile->GetItemText(hTreeItem);
	int i,j;
	m_pdtcFile->GetItemImage(hTreeItem, i, j);
	if(i == 0)
	{

		HTREEITEM root1 = m_pdtcFile->GetParentItem(hTreeItem);
		HTREEITEM root2;	

		for(root1 = hTreeItem; root1 != NULL; )
		{
			root2 = root1;
			root1 = m_pdtcFile->GetParentItem(root2);
		}

		CString str = m_pdtcFile->GetItemText(root2);

		if(str.Compare("共享文件夹") == 0)
		{	
			HTREEITEM rootTemp = m_pdtcFile->GetParentItem(hTreeItem);
			RetrieveShareFileList(hTreeItem);
		}
		else
		{
			RetrieveFileList(hTreeItem);
		}
	}
	*pResult = 0;
}


LRESULT  CWebDiskWnd::OnFileDownload(WPARAM wParam, LPARAM lParam)
{
	LRESULT lr(0);
		
	HTREEITEM hTreeItem = m_pdtcFile->GetSelectedItem();
	CString strFileName;
	strFileName = m_pdtcFile->GetItemText(hTreeItem);
	CDirDialog dlg;
	if (!dlg.DoBrowse())
	{
		return lr;
	}

	m_strDestFilePath = dlg.m_strPath;
	m_strDestFilePath += (m_strDestFilePath.Right(1) == _T("\\") ? _T("") : _T("\\")) + strFileName;

	CString strRootPath, strTemp = _T("");

//	m_pdtcFile->DeleteItem(root);

	HTREEITEM parent;
	parent = hTreeItem;
	while(1)
	{
		strTemp = m_pdtcFile->GetItemText(parent);
		strRootPath = _T("\\") + strTemp + strRootPath;
		parent = m_pdtcFile->GetParentItem(parent);
		if(parent == NULL)
			break;
	}

	BSTR bstrTest = ::SysAllocString(NULL);
	BSTR bstrRet = ::SysAllocString(NULL);
	bstrTest = strRootPath.AllocSysString();
	__int64 nFileSize;

	m_pService->GetFileSize(m_bstrTicket, bstrTest, &nFileSize);


	g_pDFI.strFileName = strRootPath;
	g_pDFI.nFileSize = nFileSize;
	g_pDFI.pWnd = this;


	::AfxBeginThread(DownloadFile, &g_pDFI);

//	DownloadFile(strFilePath, nFileSize, this);

	SysFreeString(bstrTest);
	SysFreeString(bstrRet);
	return lr;
}

UINT DownloadFile(LPVOID p)
{
	struct DownloadFileInfo *pVoid = (struct DownloadFileInfo *)p;
	CString strFileName;
	strFileName.Format(_T("%s"), pVoid->strFileName);
	__int64 nFileSize = pVoid->nFileSize;
	CWebDiskWnd* pWnd = pVoid->pWnd;
	//以每64KB为大小,上传文件	
	BSTR bstrFileName = ::SysAllocString(NULL);
	bstrFileName = strFileName.AllocSysString();

	char ch[255];
//	strcpy(ch, pWnd->m_strDestFilePath.GetBuffer());
	sprintf(ch, "%s", pWnd->m_strDestFilePath);

	FILE *fp;
	fp = fopen(ch, (const char*)("wb"));

	long ChunkSize;
	long ChunkCount;
	ChunkSize = 1024 * 1024 * 2;
	ChunkCount = nFileSize / (ChunkSize);

	pWnd->m_pgcTest.SetRange(0, ChunkCount+1);
	pWnd->m_pgcTest.SetStep(1);

	ATLSOAP_BLOB asbBuffer;

	int i=0;
	for(i=0; i<ChunkCount; i++)
	{
		asbBuffer.data = (unsigned char*)malloc(ChunkSize);
		asbBuffer.size = ChunkSize;

		pWnd->m_pService->DownloadChunk(pWnd->m_bstrTicket, bstrFileName, ChunkSize*i, ChunkSize, &asbBuffer);

		fwrite(asbBuffer.data, ChunkSize, 1, fp);
		pWnd->m_pgcTest.StepIt();
		free(asbBuffer.data);
	}

	ChunkSize = nFileSize % ChunkSize;

	asbBuffer.data = (unsigned char*)malloc(ChunkSize);
	asbBuffer.size = ChunkSize;

	pWnd->m_pService->DownloadChunk(pWnd->m_bstrTicket, bstrFileName, 1024 * 1024 * 2*i, ChunkSize, &asbBuffer);
	fwrite(asbBuffer.data, ChunkSize, 1, fp);

	int nLower, nUpper;
	pWnd->m_pgcTest.GetRange( nLower, nUpper );
	pWnd->m_pgcTest.SetPos(nUpper);

	free(asbBuffer.data);
	fclose(fp);

	SysFreeString(bstrFileName);

	Sleep(10);
	pWnd->m_pgcTest.SetPos(0);

	return 0;

}

LRESULT  CWebDiskWnd::OnFileUpload(WPARAM wParam, LPARAM lParam)
{
	LRESULT lr(0);
	if(m_pService == NULL)
	{
		::AfxMessageBox("用户没有登陆!");
		return lr;
	}

		
	HTREEITEM hTreeItem = m_pdtcFile->GetSelectedItem();
	int i,j;
	m_pdtcFile->GetItemImage(hTreeItem, i, j);
	if(i != 0)
	{
		::AfxMessageBox("请选择一个上传文件夹!");
		return  lr;
	}

	if(m_FileList.GetCount() > 1)
	{
		::AfxMessageBox("请选择一个文件!");
		return  lr;
	}

	CString strFileName;
	strFileName = m_pdtcFile->GetItemText(hTreeItem);

	CString strRootPath, strTemp = _T("");
	HTREEITEM parent;
	parent = hTreeItem;
	while(1)
	{
		strTemp = m_pdtcFile->GetItemText(parent);
		strRootPath = _T("\\") + strTemp + strRootPath;
		parent = m_pdtcFile->GetParentItem(parent);
		if(parent == NULL)
			break;
	}
	POSITION pos = m_FileList.GetHeadPosition();
	CString strFilePath;
	m_strDestFilePath = m_FileList.GetNext(pos);
	
	int nBegin;
	nBegin = m_strDestFilePath.ReverseFind('\\');
	strTemp = m_strDestFilePath.Mid(nBegin+1);

	strRootPath += "\\" + strTemp;

	g_pUFI.pWnd = this;
	g_pUFI.strFilePath = strRootPath;
	g_pUFI.TreeInfo = hTreeItem;

	::AfxBeginThread(UploadFile, &g_pUFI);


/*
	//获取文件名列表中的文件名,并上传每个文件
	CString strFilePath;
	int i;

	for(POSITION pos = m_FileList.GetHeadPosition(); pos != NULL;)
	{
		strFilePath = m_FileList.GetNext(pos);

		g_pUFI.strFilePath = strFilePath;
		g_pUFI.pWnd = this;

		::AfxBeginThread(UploadFile, &g_pUFI);

	}
*/

	
	return lr;
}

UINT UploadFile(LPVOID p)
{

	struct UploadFileInfo *pVoid = (struct UploadFileInfo*)p;

	CString strFilePath = pVoid->strFilePath;
	CWebDiskWnd* pWnd = pVoid->pWnd;

	CString strFileName;

	//从路径中取得文件名称(如从"c:\abc\123.txt"中取得"123.txt")
/*	int nBegin;
	nBegin = strFilePath.ReverseFind('\\');
	strFileName = strFilePath.Mid(nBegin+1);
*/
	BSTR bstrFileName = ::SysAllocString(NULL);
	bstrFileName = strFilePath.AllocSysString();

	__int64 nCurFileLen;
	pWnd->m_pService->CheckUpLoad(pWnd->m_bstrTicket, bstrFileName, &nCurFileLen);

	if(nCurFileLen > 0)
	{
		if(IDNO == ::MessageBox(NULL, "有同名文件,是否续传?", "RTX", MB_YESNO))
		{
			return 0;
		}
	}

	//打开文件,注意要用“二进制”形式
	FILE *fp=NULL;
	fp = fopen(pWnd->m_strDestFilePath, "rb");

	//取得文件大小
	struct _stat buf;
	_stat( pWnd->m_strDestFilePath, &buf );
	long sizeFile = buf.st_size;

	//以每64KB为大小,上传文件
	long ChunkSize;
	long ChunkCount;

	ChunkSize = 1024 * 1024 * 2;
	ChunkCount = (buf.st_size - nCurFileLen) / (ChunkSize);

	pWnd->m_pgcTest.SetRange(0, ChunkCount+1);
	pWnd->m_pgcTest.SetStep(1);

	ATLSOAP_BLOB asbBuffer;

	int nRet = 1;
	fseek(fp, nCurFileLen, SEEK_SET);
	int i=0;
	for(i=0; i<ChunkCount; i++)
	{
		asbBuffer.data = (unsigned char*)malloc(ChunkSize);
		asbBuffer.size = ChunkSize;

		fread(asbBuffer.data, ChunkSize, 1, fp);

		pWnd->m_pService->AppendChunk(pWnd->m_bstrTicket, bstrFileName, asbBuffer, nCurFileLen + ChunkSize*i, ChunkSize, sizeFile, &nRet);

		if(nRet != 0)
		{
			::AfxMessageBox("传送失败!");
			pWnd->m_pgcTest.SetPos(0);
			return  0;
		}
		pWnd->m_pgcTest.StepIt();


		free(asbBuffer.data);
	}

	ChunkSize = buf.st_size % ChunkSize;

	asbBuffer.data = (unsigned char*)malloc(ChunkSize);
	asbBuffer.size = ChunkSize;
	fread(asbBuffer.data, ChunkSize, 1, fp);

	pWnd->m_pService->AppendChunk(pWnd->m_bstrTicket, bstrFileName, asbBuffer, nCurFileLen + 1024 * 1024 * 2 * i, ChunkSize, sizeFile, &nRet);
	if(nRet != 0)
	{
		::AfxMessageBox("传送失败!");
		pWnd->m_pgcTest.SetPos(0);
		return  0;
	}

	int nLower, nUpper;
	pWnd->m_pgcTest.GetRange( nLower, nUpper );
	pWnd->m_pgcTest.SetPos(nUpper);

	free(asbBuffer.data);

	//释放空间
	SysFreeString(bstrFileName);
	pWnd->m_pgcTest.SetPos(0);
//	SysFreeString(bstrTicket);

	pWnd->RetrieveFileList(pVoid->TreeInfo);
	return 0;
}

LRESULT  CWebDiskWnd::OnFileDelete(WPARAM wParam, LPARAM lParam)
{
	LRESULT lr(0);

	HTREEITEM hTreeItem = m_pdtcFile->GetSelectedItem();
	HTREEITEM hRoot;
	hRoot = m_pdtcFile->GetParentItem(hTreeItem);

	CString strRootPath, strTemp = _T("");

//	m_pdtcFile->DeleteItem(root);

	HTREEITEM parent;
	parent = hTreeItem;
	while(1)
	{
		strTemp = m_pdtcFile->GetItemText(parent);
		strRootPath = _T("\\") + strTemp + strRootPath;
		parent = m_pdtcFile->GetParentItem(parent);
		if(parent == NULL)
			break;
	}

	BSTR bstrTest = ::SysAllocString(NULL);
	BSTR bstrRet = ::SysAllocString(NULL);
	bstrTest = strRootPath.AllocSysString();

	m_pService->ReMove(m_bstrTicket, bstrTest, &bstrRet);

	CString str;
	str = _com_util::ConvertBSTRToString(bstrRet);

	if(!str.IsEmpty())
	{
		::AfxMessageBox(_T("Delete Error!"));
	}

	SysFreeString(bstrTest);

	RetrieveFileList(hRoot);
//	m_pdtcFile->Expand(hRoot, TVE_COLLAPSE );
	m_pdtcFile->Expand(hRoot, TVE_EXPAND);

	return lr;
}
void CWebDiskWnd::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	if(m_edPassword.GetSafeHwnd() != NULL)
	{
		dc.SetBkMode(TRANSPARENT);
		dc.SelectObject(&m_ftCtrl);
		dc.TextOut(20, 35, _T("用户名"));
		dc.TextOut(20, 65, _T("密  码"));
	}
	// TODO: 在此处添加消息处理程序代码
	// 不为绘图消息调用 CWnd::OnPaint()
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -