📄 tab4.cpp
字号:
// 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 + -