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

📄 tab4.cpp

📁 操作系统实验演示代码(三个实验
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// Tab4.cpp : implementation file
//

#include "stdafx.h"
#include "OSDemo.h"
#include "Tab4.h"
#include "PieChartCtrl.h"
#include "CheckerCtrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
FAT FileFAT;
CFile FATIO;
CString CurrentUser;
int CurrentID;
bool bLogin;
bool bFormated;
bool WriteFAT()
{
     FATIO.SeekToBegin();
     FATIO.Write(&FileFAT,sizeof(FileFAT));
	 return true;
}
bool CheckLogin()
{
	if (!bLogin)
	{
		AfxMessageBox("请先登录文件系统!");
		return false;
	}
	else
		return true;
}

bool ReadFAT()
{
	 ZeroMemory(&FileFAT,sizeof(FileFAT));
	 FATIO.SeekToBegin();
     if (!FATIO.Read(&FileFAT,sizeof(FileFAT))) return false;
	 return true;
}




bool FileExist(CString FilePath)
{
    HANDLE Handle;
	WIN32_FIND_DATA W32;
    Handle=FindFirstFile(FilePath,&W32);
	if (Handle!=INVALID_HANDLE_VALUE)
       return true;
	else
	   return false;
}



bool Format()
{
     CString FATFile;
	 int i;
	 char fname[128];
	 ::GetCurrentDirectory(128,fname);   //FAT表信息保存在当前目录的VDISK.DAT中
	 FATFile.Format("%s",fname);
	 if (FATFile.Right(1)!="\\")
		 FATFile+="\\VDISK.DAT";
	 else
         FATFile+="VDISK.DAT";
	 CFile fout;
	 if( !fout.Open(FATFile,CFile::modeCreate|CFile::modeWrite,NULL))
	 {
		 return false;
	 }
	 
	 ZeroMemory(&FileFAT,sizeof(FileFAT));
	 FileFAT.SuperBlock.HeadInfo.pStack=0;
	 for(i=0;i<10;i++)
	 {
        FileFAT.SuperBlock.HeadInfo.pBlock[i]=i+1;
	 }

	 fout.WriteHuge(&FileFAT,sizeof(FileFAT));
	 BYTE *Buffer;
	 
	 Buffer=(BYTE*)malloc(DISKSIZE);

     ZeroMemory(Buffer,DISKSIZE);
	 BLOCK newBlock;
	 for (i=10;i<=990;i+=10)
	 {
		  ZeroMemory(&newBlock,sizeof(newBlock));
		  newBlock.HeadInfo.pStack=0;
		  for (int k=0;k<10;k++)
		  {
			 newBlock.HeadInfo.pBlock[k]=i+1+k;
		  }
		  memcpy(Buffer+32*(i-1),&newBlock,32);
	 }
	
	 fout.WriteHuge(Buffer,DISKSIZE);
	 
	 free(Buffer);
	 
     fout.Close();
	 AfxMessageBox("创建虚拟磁盘文件成功!请选择用户管理添加新用户。");
	 return true;
}
void StartIO()    //打开VDISK.DAT文件,把该文件句柄保存在全局变量中,如果该文件不存在,创建并初始化该文件。
{
     CString FATFile;
	 char fname[128];
	 ::GetCurrentDirectory(128,fname);   //FAT表信息保存在当前目录的VDISK.DAT中
	 FATFile.Format("%s",fname);
	 if (FATFile.Right(1)!="\\")
		 FATFile+="\\VDISK.DAT";
	 else
         FATFile+="VDISK.DAT";
	 bFormated=true;
	 if (!FileExist(FATFile))
	 {
		 AfxMessageBox("当前目录下找不到VDISK.DAT,该文件是用来模拟磁盘及文件管理表。\n单击确定创建新的虚拟磁盘文件!");
		 bFormated=false;
			 if (!Format())
			 {
				 AfxMessageBox("创建文件系统出错!");
				 return;
			 }
	 }
	 
	 if(!FATIO.Open(FATFile,CFile::modeReadWrite|CFile::shareDenyWrite,NULL))
	 {
              AfxMessageBox("调入FAT表失败,文件系统可能出错!");
			  bFormated=false;
			  return;
	 }
	 
	
}
bool ReadBlock(int id, BLOCK* buffer)  //读指定块号内容(32字节)到buffer所指向的单元
{
	if(!FATIO) return false;
	
	if(!FATIO.Seek(sizeof(FAT)+(id-1)*BLOCKSIZE,CFile::begin)) return false;
	if(FATIO.Read(buffer,BLOCKSIZE)!=BLOCKSIZE) return false;
    return true;
}
bool WriteBlock(int id, BLOCK* buffer)  //把buffer所指向的单元的内容(32字节)写到指定的物理块中
{
    if(!FATIO) return false;   
	if(!FATIO.Seek(sizeof(FAT)+(id-1)*BLOCKSIZE,CFile::begin)) return false;
    FATIO.Write(buffer,BLOCKSIZE);
    return true;
}
USHORT AllocBlock()    //分配一物理块,成功返回逻辑块号,失败返回0;
{
     if(!FileFAT.SuperBlock.HeadInfo.pBlock[FileFAT.SuperBlock.HeadInfo.pStack]) return 0;  //没有空间可分配,失败返回
	 if(FileFAT.SuperBlock.HeadInfo.pStack<9)
	 {
		 WriteFAT();
		 return FileFAT.SuperBlock.HeadInfo.pBlock[FileFAT.SuperBlock.HeadInfo.pStack++];
	 }
	 else
	 {
         WriteFAT();
		 USHORT returnBlock=FileFAT.SuperBlock.HeadInfo.pBlock[9];
		 if(!ReadBlock(returnBlock,&FileFAT.SuperBlock)) return 0;
		 return  returnBlock;
	 }
     WriteFAT();
	 return 0;
}

bool FreeBlock(USHORT BlockID)  //回收一物理块,成功返回TRUE,失败返回FALSE
{
    if(FileFAT.SuperBlock.HeadInfo.pStack>0)
	{
       FileFAT.SuperBlock.HeadInfo.pBlock[--FileFAT.SuperBlock.HeadInfo.pStack]=BlockID;
	   BLOCK newBlock;
	   if (!WriteBlock(BlockID,&newBlock)) return false;
	}
	else
	{
       if (!WriteBlock(BlockID,&FileFAT.SuperBlock)) return false;
	   FileFAT.SuperBlock.HeadInfo.pStack=9;
	   FileFAT.SuperBlock.HeadInfo.pBlock[9]=BlockID;
	}
	WriteFAT();
	return true;	
}


class CDlgUser : public CDialog
{
// Construction
public:
	void ShowUser();
	void AddListUser(CString Name,CString FileNum);
	void InitUserList();
	CDlgUser(CWnd* pParent = NULL);   // standard constructor
    CImageList* ImageList1;
	CImageList* ImageList2;
// Dialog Data
	//{{AFX_DATA(CDlgUser)
	enum { IDD = IDD_DLG_USER };
	CListCtrl	m_UserListView;
	CString	m_UserName;
	//}}AFX_DATA


// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CDlgUser)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:

	// Generated message map functions
	//{{AFX_MSG(CDlgUser)
	virtual BOOL OnInitDialog();
	afx_msg void OnDelUser();
	afx_msg void OnAddUser();
	afx_msg void OnClickUserList(NMHDR* pNMHDR, LRESULT* pResult);
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
private:
	int ItemUser;
};
/////////////////////////////////////////////////////////////////////////////
// CDlgUser dialog


CDlgUser::CDlgUser(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgUser::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgUser)
	m_UserName = _T("");
	//}}AFX_DATA_INIT
}


void CDlgUser::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgUser)
	DDX_Control(pDX, IDC_USER_LIST, m_UserListView);
	DDX_Text(pDX, IDC_USER_NAME, m_UserName);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgUser, CDialog)
	//{{AFX_MSG_MAP(CDlgUser)
	ON_BN_CLICKED(IDC_DEL_USER, OnDelUser)
	ON_BN_CLICKED(ID_ADD_USER, OnAddUser)
	ON_NOTIFY(NM_CLICK, IDC_USER_LIST, OnClickUserList)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgUser message handlers

BOOL CDlgUser::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
    InitUserList();
	ShowUser();
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CDlgUser::InitUserList()
{
    DWORD dwStyle = m_UserListView.GetExtendedStyle();
	ListView_SetExtendedListViewStyle(m_UserListView.m_hWnd, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
	m_UserListView.InsertColumn(0,"用户名",LVCFMT_LEFT,100);
	m_UserListView.InsertColumn(1,"文件数",LVCFMT_RIGHT,50);
	ImageList1 = new CImageList();


	ImageList1->Create(16, 16, ILC_COLOR8 | ILC_MASK,  9, 9);
	ImageList1->Add(AfxGetApp()->LoadIcon(IDI_USER));
	m_UserListView.SetImageList(ImageList1, LVSIL_SMALL);
	//m_UserListView.SetImageList(ImageList2, LVSIL_NORMAL);
   
}





void CDlgUser::OnDelUser() 
{
	UpdateData(true);
	int i,j,k,pos;
	for(i=0;i<MAXUSER;i++)
	{
		if(FileFAT.Mfd[i].UserName==m_UserName)
		{
			pos=i;
			if(i==CurrentID)
			{
				MessageBox("您不能删除当前已登录的用户!","警告:",MB_ICONINFORMATION);
				return;
			}
			for(j=0;j<MAXFILE;j++)
			{
                if( FileFAT.Mfd[i].ufd[j].IsExist)
				{
				for(k=0;k<FileFAT.Mfd[i].ufd[j].BlockNum;k++)
				 {
					 if(!FreeBlock(FileFAT.Mfd[i].ufd[j].FileLink[k]))
					 {
						 MessageBox("删除用户出错,被删除帐号的文件块在回收中发生错误!");
						 return;
					 }
				 }
				}
				FileFAT.Mfd[i].ufd[j].IsExist=false;
			}
		}
	}
	ZeroMemory(&FileFAT.Mfd[pos],sizeof(MFD));
	FileFAT.UserNum--;
	WriteFAT();
	ShowUser();
}



void CDlgUser::AddListUser(CString Name, CString FileNum)
{
	LVITEM lvitem;
	int iActualItem;
	CString strDate;
	for(int iSubItem=0;iSubItem<2;iSubItem++)
	{
		lvitem.mask = LVIF_TEXT|(iSubItem == 0? LVIF_IMAGE : 0);
		lvitem.iItem = (iSubItem == 0)? ++ItemUser : iActualItem;
		lvitem.iSubItem = iSubItem;
		switch(iSubItem)
		{
		case 0:
			lvitem.pszText =(LPTSTR)(LPCTSTR)Name;
			lvitem.iImage=0;
			break;
		case 1:
			lvitem.pszText = (LPTSTR)(LPCTSTR)FileNum;
     		break;
		} 
		if (iSubItem == 0)
			iActualItem = m_UserListView.InsertItem(&lvitem);
		else
			m_UserListView.SetItem(&lvitem);
	}
}
/////////////////////////////////////////////////////////////////////////////
// CDlgLogin dialog

class CDlgLogin : public CDialog
{
// Construction
public:
	int UserID;
	void ShowUser();
	void AddUserList(CString Name);
	CString UserName;
	CImageList m_ImageList;
	void InitUserList();
	CDlgLogin(CWnd* pParent = NULL);   // standard constructor

// Dialog Data
	//{{AFX_DATA(CDlgLogin)
	enum { IDD = IDD_DIALOG_LOGIN };
	CListCtrl	m_UserList;
	CComboBox	m_UserName;
	//}}AFX_DATA


// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CDlgLogin)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:

	// Generated message map functions
	//{{AFX_MSG(CDlgLogin)
	virtual void OnOK();
	virtual BOOL OnInitDialog();
	afx_msg void OnClickUserlist(NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnDblclkUserlist(NMHDR* pNMHDR, LRESULT* pResult);
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
// CDlgLogin dialog


CDlgLogin::CDlgLogin(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgLogin::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgLogin)
	//}}AFX_DATA_INIT
}


void CDlgLogin::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgLogin)
	DDX_Control(pDX, IDC_USERLIST, m_UserList);
	DDX_Control(pDX, IDC_USERNAME, m_UserName);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgLogin, CDialog)
	//{{AFX_MSG_MAP(CDlgLogin)
	ON_NOTIFY(NM_CLICK, IDC_USERLIST, OnClickUserlist)
	ON_NOTIFY(NM_DBLCLK, IDC_USERLIST, OnDblclkUserlist)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgLogin message handlers

void CDlgLogin::OnOK() 
{
	// TODO: Add extra validation here
	m_UserName.GetWindowText(UserName);
	for(int i=0;i<10;i++)
	{
		if(UserName==FileFAT.Mfd[i].UserName)
		{
			UserID=i;
		}
	}

⌨️ 快捷键说明

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