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

📄 mainform.~cpp

📁 文件管理系统
💻 ~CPP
📖 第 1 页 / 共 4 页
字号:
//---------------------------------------------------------------------------

#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 + -