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

📄 ulexplorerview.cpp

📁 类似Linux操作系统0.11版文件系统的文件系统设计和Windows下的操作程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	int idx = m_ShellList.GetNextSelectedItem(pos);
	if (idx < 0)
		return;
	CString tmp = m_ShellList.GetItemText(idx, 0);

	CString Path = ((CMainFrame*)AfxGetMainWnd())->GetCurPath();
	
	CFileViewDlg FileDlg;
	FileDlg.SetFilePath(Path+tmp);
	FileDlg.DoModal();	
}

// 文件剪切
void CULExplorerView::OnFileCut()
{
	// TODO: 在此添加命令处理程序代码
}

// 文件复制
void CULExplorerView::OnFileCopy()
{
	// TODO: 在此添加命令处理程序代码
}

// 文件改名
void CULExplorerView::OnFileRename()
{
	POSITION pos = m_ShellList.GetFirstSelectedItemPosition();
	int idx = m_ShellList.GetNextSelectedItem(pos);
	if (idx < 0)
		return;
	CString tmp = m_ShellList.GetItemText(idx, 0);

	CNewDlg Dlg;
	Dlg.SetText(tmp);
	if (Dlg.DoModal()==IDCANCEL)
		return;

	CString NewName = Dlg.GetText();

	CString Path = ((CMainFrame*)AfxGetMainWnd())->GetCurPath();

	if (theFileSys.Rename(Path+tmp, NewName)<0)
		Waring("文件重命名失败");
	else
		ShowDentryList(Path);
}
// 删除文件
void CULExplorerView::OnFileDelete()
{
	POSITION pos = m_ShellList.GetFirstSelectedItemPosition();
	int idx = m_ShellList.GetNextSelectedItem(pos);
	if (idx < 0)
		return;
	CString tmp = m_ShellList.GetItemText(idx, 0);

	if( AfxMessageBox("确定删除", MB_OKCANCEL) == IDOK )
	{

		CString Path = ((CMainFrame*)AfxGetMainWnd())->GetCurPath();

		int Ret = theFileSys.Delete(Path + tmp);
		if (Ret<0)
		{
			Waring("删除目录失败");
			return;
		}
		ShowDentryList(Path);
	}
}
// 导入文件
void CULExplorerView::OnMenuImport()
{
	CFileDialog FileDlg(TRUE, NULL, NULL, OFN_OVERWRITEPROMPT, "文件 (*.*)|*.*|");
	if (FileDlg.DoModal()==IDOK)
	{
		CString FileName = FileDlg.GetFileName();

		if ( IsExist(FileName) )
		{
			Waring("已有同名文件啦");
			return;
		}

		CFile srcFile;
		CFileException Ex;
        if (!srcFile.Open(FileDlg.GetPathName(), CFile::modeRead, &Ex))
		{
			TCHAR szError[1024];
			Ex.GetErrorMessage(szError, 1024);
			CString Error;
			Error.Format("Windows文件打开错误:%s",szError);
			Waring(Error);
			return;
        }

		if ( srcFile.GetLength() > 10*1024*1024 )
		{
			Waring("导入文件大小超限");
			return;
		}

		CString Path = ((CMainFrame*)AfxGetMainWnd())->GetCurPath();

		int hFile = theFileSys.Open(Path+FileName, O_CREAT|O_RDWR, 0);
		if (hFile<0)
		{
			Waring("新建文件失败");
			srcFile.Close();
			return;
		}

		char buffer[4096];
		long Read, Write;
		do
		{
			Read = srcFile.Read(buffer, 4096);
			Write = theFileSys.Write(hFile, buffer, Read);

			TRACE("读入%d, 写入%d\n",Read, Write);

			if (Write<Read)
			{
				theFileSys.Close(hFile);
				theFileSys.Delete(Path+FileName);
				srcFile.Close();
				Waring("导入文件失败");
				return;
			}
		}
		while (Read > 0);

		theFileSys.Close(hFile);
		theFileSys.Sync();
		srcFile.Close();

		ShowDentryList(Path);
	}
}
// 导出文件
void CULExplorerView::OnMenuOutport()
{
	POSITION pos = m_ShellList.GetFirstSelectedItemPosition();
	int idx = m_ShellList.GetNextSelectedItem(pos);
	if (idx < 0)
		return;

	CString srcFileName = m_ShellList.GetItemText(idx, 0);

	CFileDialog FileDlg(FALSE, NULL, srcFileName, 
		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "文件 (*.*)|*.*|");

	if (FileDlg.DoModal()==IDOK)
	{
		CString dstFileName = FileDlg.GetPathName();
		
		CFile srcFile;
		CFileException Ex;
		if (!srcFile.Open(dstFileName, CFile::modeCreate|CFile::modeWrite, &Ex))
		{
			TCHAR szError[1024];
			Ex.GetErrorMessage(szError, 1024);
			CString Error;
			Error.Format("Windows文件打开错误:%s",szError);
			Waring(Error);
			return;
		}

		CString Path = ((CMainFrame*)AfxGetMainWnd())->GetCurPath();

		int hFile = theFileSys.Open(Path+srcFileName, O_RDONLY, 0);
		if (hFile<0)
		{
			Waring("打开文件失败");
			srcFile.Close();
			return;
		}

		char buffer[4096];
		DWORD dwRead;
		do
		{
			dwRead = theFileSys.Read(hFile, buffer, 4096);
			srcFile.Write(buffer, dwRead);
		}
		while (dwRead > 0);

		theFileSys.Close(hFile);
		theFileSys.Sync();
		srcFile.Close();
	}
}

// 临时导出执行
void CULExplorerView::OnMenuExecute()
{
	POSITION pos = m_ShellList.GetFirstSelectedItemPosition();
	int idx = m_ShellList.GetNextSelectedItem(pos);
	if (idx < 0)
		return;

	CString srcFileName = m_ShellList.GetItemText(idx, 0);

	TCHAR szPath[MAX_PATH];
	if (!GetTempPath(MAX_PATH, szPath))//得到系统临时目录
	{
		Waring("无法获得系统临时目录");
		return;
	}
	CString TempPath = szPath;

	CString dstFilePath = TempPath + srcFileName;


	CFile srcFile;
	CFileException Ex;
	if (!srcFile.Open(dstFilePath, CFile::modeCreate|CFile::modeWrite, &Ex))
	{
		TCHAR szError[1024];
		Ex.GetErrorMessage(szError, 1024);
		CString Error;
		Error.Format("Windows文件打开错误:%s",szError);
		Waring(Error);
		return;
	}

	CString Path = ((CMainFrame*)AfxGetMainWnd())->GetCurPath();

	int hFile = theFileSys.Open(Path+srcFileName, O_RDONLY, 0);
	if (hFile<0)
	{
		Waring("打开文件失败");
		srcFile.Close();
		return;
	}

	char buffer[4096];
	DWORD dwRead;
	do
	{
		dwRead = theFileSys.Read(hFile, buffer, 4096);
		srcFile.Write(buffer, dwRead);
	}
	while (dwRead > 0);

	theFileSys.Close(hFile);
	theFileSys.Sync();
	srcFile.Close();

    ShellExecute(this->m_hWnd, "open", dstFilePath, "", "", SW_SHOW );
}


// 打开目录
void CULExplorerView::OnDentryOpen()
{
	if ( !theFileSys.IsVDiskLoaded() ) 
		return;

	POSITION pos = m_ShellList.GetFirstSelectedItemPosition();
	int idx = m_ShellList.GetNextSelectedItem(pos);
	if (idx < 0)
		return;
	CString tmp = m_ShellList.GetItemText(idx, 0);

	TRACE("CULExplorerView::OnDoubleClickList = %s\n",tmp);

	CString Path = ((CMainFrame*)AfxGetMainWnd())->GetCurPath();

	if ( tmp=="." ) 
	{
		return;
	}
	else if ( tmp==".." ) 
	{
		m_pPaneFolders->SelectParentItem();
		return;
	}
	else
	{
		CString str = Path + tmp + "/";
		m_pPaneFolders->ExpandDentryTree(str);
	}
}

// 目录改名
void CULExplorerView::OnDentryRename()
{
	POSITION pos = m_ShellList.GetFirstSelectedItemPosition();
	int idx = m_ShellList.GetNextSelectedItem(pos);
	if (idx < 0)
		return;

	CString tmp = m_ShellList.GetItemText(idx, 0);

	CNewDlg Dlg;
	Dlg.SetText(tmp);
	if (Dlg.DoModal()==IDCANCEL)
		return;

	CString NewName = Dlg.GetText();

	CString Path = ((CMainFrame*)AfxGetMainWnd())->GetCurPath();

	if (theFileSys.Rename(Path+tmp, NewName)<0)
		Waring("目录重命名失败");
	else
		ShowDentryList(Path);

	m_pPaneFolders->ShowDentryTree();
	m_pPaneFolders->ExpandDentryTree(Path);
}

// 目录删除
void CULExplorerView::OnDentryDelete()
{
	POSITION pos = m_ShellList.GetFirstSelectedItemPosition();
	int idx = m_ShellList.GetNextSelectedItem(pos);
	if (idx < 0)
		return;
	CString tmp = m_ShellList.GetItemText(idx, 0);

	if( AfxMessageBox("确定删除", MB_OKCANCEL) == IDOK )
	{

		CString Path = ((CMainFrame*)AfxGetMainWnd())->GetCurPath();

		int Ret = theFileSys.RemoveFolder(Path + tmp);
		if (Ret<0)
		{
			Waring("删除目录失败");
			return;
		}
		m_pPaneFolders->ShowDentryTree();
		m_pPaneFolders->ExpandDentryTree(Path);

	}
}

// 判断文件是否存在
BOOL CULExplorerView::IsExist(CString Path)
{
	for (int i=0; i<m_FileArray.GetCount(); i++)
	{
		FIND_DATA& pff = m_FileArray.ElementAt(i);

		if ( pff.ff_mode != S_IFDIR )
		{
			if (!strcmp(pff.ff_name, Path))
				return TRUE;
		}
	}
	return FALSE;
}

void CULExplorerView::ClearAll(void)
{
	m_FileArray.RemoveAll();
	m_ShellList.DeleteAllItems();
}

void CULExplorerView::Delete(void)
{
	POSITION pos = m_ShellList.GetFirstSelectedItemPosition();
	int idx = m_ShellList.GetNextSelectedItem(pos);
	if (idx < 0)
		return;
	if (m_FileArray.IsEmpty())
		return;
	if ( m_FileArray.GetAt(idx).ff_mode == S_IFDIR ) 
	{
		OnDentryDelete();
	}
	else
	{
		OnFileDelete();
	}
}

⌨️ 快捷键说明

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