📄 mainform.~cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "MainForm.h"
using namespace std;
queue<DIRECTORY> que;
stack <String ,deque<String> > StackPath;
DIRECTORY CurrDir;
String FilePath;
TTreeNode *CurrNode;
FILE *Dfp; //目录及文件列表
DIRECTORY Root; //根目录
DIRECTORY Clip; //复制,剪贴用的剪贴版
extern String CurrUser;
extern MFD Mfd;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "XPMenu"
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
Clip=new directory; //初始化剪贴版
Clip->dirpoint=NULL;
Clip->filenode=NULL;
Clip->share=0; //用于判断剪贴版的内容 0为空 1为文件 2为目录
Clip->property=0; //用于判断是何种操作 0复制 1剪切
Root=new directory; //初始化根节点
Root->name="Root";
Root->del=0;
Root->filenum=0;
Root->dirnum=0;
Root->dirpoint=NULL;
Root->next=NULL;
Root->filenode=NULL;
Root->father=NULL;
Root->share=1;
Root->property=1;
if(!FileExists("DIR.txt")) //初始化文件目录链表
{
int f=FileCreate("DIR.txt");
FileClose(f);
Dfp=fopen("DIR.txt","r+");
}//end if
else {
Dfp=fopen("DIR.txt","r+");
fseek(Dfp,0L,2);
int filelength=ftell(Dfp);
if(filelength!=0)InitDir(Dfp);
}//end else
}
//---------------------------------------------------------------------------
void TForm2::InitDir(FILE * FpDir) //初始化文件树
{
DIRECTORY Temp;
DIRECTORY InDir;
//保存目录指针的队列
int Dirnum;
int Filnum;
int FPtr; //文件读写指针位置。
queue<DIRECTORY>que; //文件和目录队列
fseek(FpDir,0,0);
fread(&Dirnum,4,1,FpDir);
fseek(FpDir,4,0);
fread(&Filnum,4,1,FpDir);
Root->dirnum=Dirnum;
Root->filenum=Filnum;
fseek(FpDir,8,0); //重新定位文件指针
que.push(Root);
while(!que.empty())
{
Temp=que.front();
que.pop();
Dirnum=Temp->dirnum;
Filnum=Temp->filenum;
FPtr=ftell(FpDir);
ReadDir(FpDir,Temp,Dirnum,FPtr);//读取子目录
FPtr+=68*Dirnum;//重定位文件指针位置,
InDir=Temp->dirpoint;
while(InDir) //子目录入队列
{que.push(InDir);
InDir=InDir->next;
}
ReadFile(FpDir,Temp,Filnum,FPtr); //读取子文件
FPtr+=64*Filnum;
fseek(FpDir,FPtr,0);
}
}
//--------------------------------------------------------------------------
void TForm2::ReadDir(FILE * fp, DIRECTORY & dir, int N, int pos)
{ //读入目录信息
char name[16],user[16],date[20];
int property,share,dirnum,filenum;
DIRECTORY newdir;
for(int i=0;i<N;i++)
{
fseek(fp,68*i+pos,0); //目录名
fread(&name,16,1,fp);
fseek(fp,68*i+16+pos,0); //用户名
fread(&user,16,1,fp);
fseek(fp,68*i+32+pos,0); //创建日期
fread(&date,20,1,fp);
fseek(fp,68*i+52+pos,0); //属性
fread(&property,4,1,fp);
fseek(fp,68*i+56+pos,0); //共享
fread(&share,4,1,fp);
fseek(fp,68*i+60+pos,0); //文件数
fread(&filenum,4,1,fp);
fseek(fp,68*i+64+pos,0); //目录数
fread(&dirnum,4,1,fp);
newdir=new directory;
newdir->user=user;
newdir->name=name;
newdir->date=date;
newdir->property=property;
newdir->share=share;
newdir->filenum=filenum;
newdir->dirnum=dirnum;
newdir->del=0;
newdir->next=NULL;
newdir->dirpoint=NULL;
newdir->filenode=NULL;
newdir->father=NULL;
InsertDir(dir,newdir);
}//end for
}
//--------------------------------------------------------------------------
void TForm2::ReadFile(FILE * fp, DIRECTORY & dir, int N, int pos)
{ //读入文件信息
char name[16],user[16],date[20];
int property,share,length;
for(int i=0;i<N;i++)
{
fseek(fp,64*i+pos,0);
fread(&name,16,1,fp);
fseek(fp,64*i+16+pos,0);
fread(&user,16,1,fp);
fseek(fp,64*i+32+pos,0);
fread(&date,20,1,fp);
fseek(fp,64*i+52+pos,0);
fread(&property,4,1,fp);
fseek(fp,64*i+56+pos,0);
fread(&share,4,1,fp);
fseek(fp,64*i+60+pos,0);
fread(&length,4,1,fp);
FILENODE newfile;
newfile=new filenode;
newfile->user=user;
newfile->name=name;
newfile->date=date;
newfile->property=property;
newfile->share=share;
newfile->length=length;
newfile->del=0;
newfile->next=NULL;
newfile->father=NULL;
InsertFile(dir,newfile);
}//end for
}
//-----------------------------------------------------------------------------
void TForm2::InsertDir(DIRECTORY & dir,DIRECTORY newdir)
{
newdir->father=dir; //添加目录
DIRECTORY Ptr=dir;
if(!Ptr->dirpoint)
Ptr->dirpoint=newdir;
else
{Ptr=Ptr->dirpoint;
while(Ptr->next)Ptr=Ptr->next;
Ptr->next=newdir;
}
}
//---------------------------------------------------------------------------
void TForm2::InsertFile(DIRECTORY & dir,FILENODE newfile)
{
newfile->father=dir;
FILENODE Ptr; //添加文件
Ptr=dir->filenode;
if(!Ptr)
dir->filenode=newfile;
else {
while(Ptr->next)
Ptr=Ptr->next;
Ptr->next=newfile ;
}
}
//---------------------------------------------------------------------------
void TForm2::ListTree(DIRECTORY dir, TTreeNode * tree,int tag) //显示文件树
{ //tag为0则为子目录,1为同级目录
bool f=(dir->del==0&&(CurrUser=="root"||dir->user==CurrUser||dir->share==1));
if(f){
if(!tag)tree=TreeView1->Items->AddChild(tree,dir->name); //tag为0则为子目录
else tree=TreeView1->Items->Add(tree,dir->name); //tag为1为同目录
tree->SelectedIndex=2;
if(dir->dirpoint)ListTree(dir->dirpoint,tree,0);
}
if(dir->next){
if(f)ListTree(dir->next,tree,1); //dir的第一个孩子加入树中,dir->next作为同级目录
else if(dir==dir->father->dirpoint) ListTree(dir->next,tree,0); //dir的第一个孩子未加入树中,dir->next作为子目录
else ListTree(dir->next,tree->Parent,0); //dir没有加入树中,dir->next作为dir父节点的孩子
}
}
//--------------------------------------------------------------
void __fastcall TForm2::TreeView1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(TreeView1->Selected)
{
TTreeNode *node;
node=TreeView1->GetNodeAt(X,Y);
if(node)
{
CurrNode=node;
CurrNode->Selected=true;
OutPath(node); //输出绝对路径
CurrDir=SearchDir(); //找到目录节点
ShowDir(CurrDir); //显示目录内容
}
}
}
//------------------------------------------------
void TForm2::OutPath(TTreeNode * node) //输出绝对路径
{
while(!StackPath.empty()) StackPath.pop();
StackPath.push(node->Text);
FilePath=node->Text+"\\";
while(node->Parent) //反向查找路径,并入栈
{ StackPath.push(node->Parent->Text);
FilePath=node->Parent->Text+"\\"+FilePath;
node=node->Parent;
}
ComboBox1->Text=FilePath;
}
//----------------------------------------------------------------------------
DIRECTORY TForm2::SearchDir() //查找目录节点
{
DIRECTORY rootdir=Root;
String name;
while(!StackPath.empty())
{
name=StackPath.top();
StackPath.pop();
while(rootdir)
{
if(rootdir->del==0&&rootdir->name==name) //当前目录匹配
{
if(StackPath.empty())return rootdir; //栈为空,找到节点
else {
rootdir=rootdir->dirpoint; //栈不空,进入子目录
break;
}
}
else rootdir=rootdir->next; //当前目录不匹配,找下一个同层目录
}
}
return rootdir;
}
//-----------------------------------------------------------------------------
void TForm2::ShowDir(DIRECTORY &dir) //显示文件夹的内容
{
DIRECTORY tempdir;
FILENODE tempfile;
tempdir=dir->dirpoint;
tempfile=dir->filenode;
TListItem *Item;
ListView1->Items->Clear();
ListView1->Refresh();
int d=0,f=0;
while (tempdir) //显示子目录信息
{
if(tempdir->del==0&&(CurrUser=="root"||tempdir->user==CurrUser||tempdir->share==1)){
Item=ListView1->Items->Add();
Item->ImageIndex=0; //设定图标
Item->Caption=tempdir->name; //文件夹名
Item->SubItems->Add("文件夹"); //类型
if(!tempdir->property)Item->SubItems->Add("只读");//属性
else Item->SubItems->Add("允许读写");
if(!tempdir->share)Item->SubItems->Add("禁止共享"); //共享
else Item->SubItems->Add("允许共享");
Item->SubItems->Add(""); //大小
Item->SubItems->Add(tempdir->user); //创建人
Item->SubItems->Add(tempdir->date); //创建时间
d++;
}
tempdir=tempdir->next;
}
while (tempfile) //显示文件信息
{
if(tempfile->del==0&&(CurrUser=="root"||tempfile->user==CurrUser||tempfile->share==1)){
Item=ListView1->Items->Add();
Item->ImageIndex=1; //设定图标
Item->Caption=tempfile->name; //文件名
Item->SubItems->Add(tempfile->name.SubString(tempfile->name.Length()-2,3)+" 文件");
if(!tempfile->property)Item->SubItems->Add("只读");//属性
else Item->SubItems->Add("允许读写");
if(!tempfile->share)Item->SubItems->Add("禁止共享"); //共享
else Item->SubItems->Add("允许共享");
Item->SubItems->Add(String(tempfile->length)+"KB");
Item->SubItems->Add(tempfile->user);
Item->SubItems->Add(tempfile->date);
f++;
}
tempfile=tempfile->next;
}
ListView1->Refresh();
StatusBar1->Panels->Items[0]->Text="当前文件夹名称: "+dir->name+
" 文件夹个数: "+IntToStr(d)+" 文件个数: "+IntToStr(f);
}
//----------------------------------------------------------------------------
void TForm2::SaveDir(FILE *fp) //保存目录结构
{
fclose(Dfp);
DeleteFile("DIR.txt");
int f=FileCreate("DIR.txt");
FileClose(f);
fp=fopen("DIR.txt","r+");
DIRECTORY temp;
DIRECTORY InDir;
int Filenum;
int Dirnum;
int pos;
Filenum=Root->filenum;
Dirnum=Root->dirnum;
fseek(fp,0,0);
fwrite(&Dirnum,4,1,fp);
fseek(fp,4,0);
fwrite(&Filenum,4,1,fp);
fseek(fp,8,0);
que.push(Root);
while(!que.empty()){
temp=que.front();
que.pop();
Dirnum=temp->dirnum;
Filenum=temp->filenum;
pos=ftell(fp);
WriteDir(fp,temp,Dirnum,pos);
pos+=Dirnum*68;
InDir=temp->dirpoint;
while(InDir){ //目录节点进队列
que.push(InDir);
InDir=InDir->next;}
WriteFile(fp,temp,Filenum,pos);
pos+=Filenum*64;
fseek(fp,pos,0);
}
fclose(fp);
}
//---------------------------------------------------------------------
void TForm2::WriteDir(FILE * fp, DIRECTORY dir, int N, int pos)
{ //写文件
if(N>0)
{
char Name[16];
char User[16];
char Date[20];
int i=0;
DIRECTORY SubDir;
SubDir=dir->dirpoint;
while(SubDir){
if(SubDir->del==0){
StrPCopy(Name,SubDir->name);
StrPCopy(User,SubDir->user);
StrPCopy(Date,SubDir->date);
fseek(fp,68*i+pos,0);
fwrite(&Name,SubDir->name.Length(),1,fp);
fseek(fp,68*i+16+pos,0);
fwrite(&User,SubDir->user.Length(),1,fp);
fseek(fp,68*i+32+pos,0);
fwrite(&Date,SubDir->date.Length(),1,fp);
fseek(fp,68*i+52+pos,0);
fwrite(&SubDir->property,4,1,fp);
fseek(fp,68*i+56+pos,0);
fwrite(&SubDir->share,4,1,fp);
fseek(fp,68*i+60+pos,0);
fwrite(&SubDir->filenum,4,1,fp);
fseek(fp,68*i+64+pos,0);
fwrite(&SubDir->dirnum,4,1,fp);
i++;
}
SubDir=SubDir->next;
}
}
}
//---------------------------------------------------------------------------
void TForm2::WriteFile(FILE * fp, DIRECTORY dir, int N, int pos)
{ //写文件
if(N>0){
char Name[16];
char User[16];
char Date[20];
int i=0;
FILENODE SubFile;
SubFile=dir->filenode;
while(SubFile){
if(SubFile->del==0){
StrPCopy(Name,SubFile->name);
StrPCopy(User,SubFile->user);
StrPCopy(Date,SubFile->date);
fseek(fp,64*i+pos,0);
fwrite(&Name,SubFile->name.Length(),1,fp);
fseek(fp,64*i+16+pos,0);
fwrite(&User,SubFile->user.Length(),1,fp);
fseek(fp,64*i+32+pos,0);
fwrite(&Date,SubFile->date.Length(),1,fp);
fseek(fp,64*i+52+pos,0);
fwrite(&SubFile->property,4,1,fp);
fseek(fp,64*i+56+pos,0);
fwrite(&SubFile->share,4,1,fp);
fseek(fp,64*i+60+pos,0);
fwrite(&SubFile->length,4,1,fp);
i++;
}
SubFile=SubFile->next;
}
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -