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

📄 unit1.~pas

📁 文件管理系统模拟
💻 ~PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Unit2,
  Dialogs, ExtCtrls, ComCtrls, ImgList,shellapi, StdCtrls, Buttons, Menus,
  Grids, DBGrids;

type
  TListFile = class(TForm)
    dir: TTreeView;
    wfile: TListView;
    ImageList1: TImageList;
    ImageList2: TImageList;
    PopupMenu1: TPopupMenu;
    PopupMenu2: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    l1: TMenuItem;
    zt: TStatusBar;
    Splitter1: TSplitter;
    Image1: TImage;
    N12: TMenuItem;
    N13: TMenuItem;
    procedure dirCollapsed(Sender: TObject; Node: TTreeNode);
    procedure dirExpanded(Sender: TObject; Node: TTreeNode);
    procedure wfileDblClick(Sender: TObject);
    procedure dirClick(Sender: TObject);
    procedure dirEdited(Sender: TObject; Node: TTreeNode; var S: String);
    procedure wfileEdited(Sender: TObject; Item: TListItem; var S: String);
    procedure dirKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure N1Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure l1Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N11Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N12Click(Sender: TObject);
    procedure N13Click(Sender: TObject);
  private
    { Private declarations }
    procedure filedir(dirname:string;node:ttreenode);//查找文件
    procedure wmdropfiles(var msg:twmdropfiles);message wm_dropfiles;
  public
    { Public declarations }
  end;

var
 listfile: TListFile;
 fileinfo:shfileinfo;
 f:array [0..0,0..2] of string;
 ListItem: TListItem;
 filename,names:string;
 pathname:string;
 node1,node3:ttreenode;

implementation

{$R *.dfm}

function IsValidDir(SearchRec:TSearchRec):Boolean;
begin
  if ((SearchRec.Attr=16)or (searchrec.Attr =17)or
     (searchrec.Attr =18)or (searchrec.Attr =22)
     or (searchrec.Attr =49)or (searchrec.Attr =48))
      and (SearchRec.Name<>'.')
     and (SearchRec.Name<>'..') then
      Result:=True
  else
     Result:=False;
  //showmessage(inttostr(searchrec.Attr ));
end;
////////以上是一个函数,功能是判断一个文件是不是文件夹。

function panel(node:ttreenode):string;
var
str:string;
node2:ttreenode;
begin
  try
  node2:=node.Parent;//返回父节点
  str:=node2.Text+str;
  node1:=node2;
  filename:=str+'\'+filename;
  panel(node2);
  except
  panel:=filename;
  end;
end;
///////一个递归函数,找到node的父节点。



procedure tlistfile.wmdropfiles(var msg:twmdropfiles);
var
   numfiles:longint;
   i:longint;
   buffer:array[0..255] of char;
begin
  showmessage('asdfasdf');
end;
////////用兴趣的朋友可以在这处理鼠标拖放,本人没有处理,只是打到了。

procedure tlistfile.filedir(dirname:string;node:ttreenode);
var
    searchrec:tsearchrec;
    filename:string;
    node1:ttreenode;
    i:integer;
begin
  try
  for i:=node.Count -1 downto 0 do    
    begin
      node.Item [i].Delete ;       // count为node的子节点数item【i】node 的子节点
    end;
  except
  end;
                                  //更新目录
  filename:=dirname+'\*.*';
  wfile.Clear;
  listfile.ImageList2.Clear;
  listitem:=wfile.Items.Add;
  listitem.Caption:='..';
  if findfirst(filename,faAnyFile,searchrec)=0 then   //findfirst查找成功返回0,否则返回错误代码
    begin
      while findnext(searchrec)=0 do
        begin
         if IsValidDir(searchrec) then
           begin
             node1:=listfile.dir.Items.AddChild(node,searchrec.Name );
             node1.ImageIndex:=1;
             node1.SelectedIndex:=2;
             listfile.dir.Items.AddChild(node1,'' );
             shgetfileinfo(pchar(dirname+'\'+searchrec.Name ),0,fileinfo,sizeof(fileinfo),shgfi_icon);
             listfile.image1.Picture.Icon.Handle:=fileinfo.hIcon;//返回文件的图标
             listfile.ImageList2.AddIcon(listfile.image1.Picture.Icon);//添加图标
             f[0,0]:=searchrec.Name;//+'   '+inttostr(searchrec.Attr );
             f[0,1]:=inttostr(searchrec.Size);
             f[0,2]:=datetimetostr(filedatetodatetime(searchrec.Time ));
             listitem:=wfile.Items.Insert(1);
             listitem.Caption:=f[0,0];
             listitem.SubItems.Add('');
             listitem.SubItems.add(f[0,2]);
             wfile.Items[1].ImageIndex:=imagelist2.Count-1 ;
             wfile.Items[0].ImageIndex:=imagelist2.Count-1;
           end
         else
           begin
             if searchrec.Name<>'..' then
               begin
                 f[0,0]:=searchrec.Name;
                 f[0,1]:=inttostr(searchrec.Size);
                 f[0,2]:=datetimetostr(filedatetodatetime(searchrec.Time ));
                 listitem:=listfile.wfile.Items.Add;       //创建
                 listitem.Caption:=f[0,0];          
                 listitem.SubItems.Add(f[0,1]);
                 listitem.SubItems.Add(f[0,2]);
                 shgetfileinfo(pchar(dirname+'\'+searchrec.Name ),0,fileinfo,sizeof(fileinfo),shgfi_icon);
                 listfile.image1.Picture.Icon.Handle:=fileinfo.hIcon;////返回文件图标
                 listfile.ImageList2.AddIcon(listfile.image1.Picture.Icon);
                 wfile.Items[wfile.Items.Count-1].ImageIndex:=imagelist2.Count -1;
               end;
           end;
        end;
    end;
  findclose(searchrec); //释放内存
end;
//////////////以上是查找文件的过程

procedure SelectNode(const Tx: string; Tree: TTreeView);
var www:Boolean;

begin
  if Tx = '' then exit;
  node3:=tree.Items.GetFirstNode;
  while node3<>nil do
  begin
    if pathname+'\'+node3.Text = tx then
      begin                                                //选中的是目录则打开目录
        node3.Expanded:=true;
        www:=true;
        break;
      end
    else
      begin
        try
        node3:=node3.GetNext;
        except
        showmessage(tx);
        shellexecute(listfile.handle,nil,pchar(tx ),nil,nil,sw_shownormal);
        end;
      end;
  end;
  if www=false then
  shellexecute(listfile.handle,nil,pchar(tx ),
          nil,nil,sw_shownormal);
end;
//以上是一个过程,处理鼠标在listviewh 双击事件过程
//在树中查找

procedure Tlistfile.FormCreate(Sender: TObject);
var
    fname:string;
    node:ttreenode;
    rnode:ttreenode;
begin
  dragacceptfiles(handle,true);
  application.Title:='文件管理模拟系统';
           
           node:=dir.Items.AddChild(nil,'MFD');
           rnode:=dir.Items.AddChild(node,'');
           rnode.ImageIndex:=0;
           fname:='MFD';
           f[0,0]:=fname;
           listitem:=wfile.Items.Add;
           listitem.Caption:=f[0,0];
           listitem.SubItems.Add(f[0,1]);

end;

procedure TListFile.N7Click(Sender: TObject);
begin
  mkdir(pathname+'\'+'新建文件夹');
  if IOResult<>0  then
    MessageDlg('请检查是否重名', mtWarning, [mbOk], 0)
  else
  begin
  listitem:=wfile.Items.Add;
  listitem.Caption:='新建文件夹';
  listitem.ImageIndex:=0;
  filedir(pathname,dir.Selected);
  end;
end;///////在wfile上新建文件夹时.


procedure TListFile.N2Click(Sender: TObject);
var node:ttreenode;
 s:string;i:integer;
begin
  i:=pos(dir.Selected.Text,pathname);
  s:=pathname;
  delete(s,i,length(dir.Selected.Text ));
  //showmessage(s+'新建文件夹');
  mkdir(s+'新建文件夹');
  node:=dir.Items.AddChild(dir.Selected.Parent,'新建文件夹');
  node.ImageIndex:=1;
  node.SelectedIndex:=1;
  node.EditText;
end;/////////点击新建文件夹时。


procedure TListFile.N3Click(Sender: TObject);
begin
  dir.Selected.EditText;
end;



procedure TListFile.N5Click(Sender: TObject);
begin
  if deletefile(pathname+'\'+wfile.Selected.Caption) then
    begin
      filedir(pathname,dir.Selected);
      zt.Panels[0].Text:='删除成功';
    end
  else
    begin
      zt.Panels[0].Text:='删除不成功';
    end;
end;////处理在listview上删除一个对象是删除个文件


procedure TListFile.dirExpanded(Sender: TObject; Node: TTreeNode);
begin
  panel(node);
  names:=filename;              //相对路进名
  if filename<>'' then
    begin
      filedir(filename+node.Text  ,node);
      pathname:=filename+node.Text;
    end
  else
    begin
      filedir(node.Text ,node);
      pathname:=node.Text;
    end;
   filename:='';
end;

procedure TListFile.wfileDblClick(Sender: TObject);
var
i:integer;
begin
  try
  if (wfile.ItemIndex=0) and (wfile.Selected.Caption<>'MFD') then          //返回上级目录
    begin
    dir.Selected.Collapse(true);
    //node3.Expanded:=true;
    dir.Selected.Parent.Selected:=true;
    dir.OnClick(dir.Selected.Parent);
    end

  else
  SelectNode(pathname+'\'+wfile.Selected.Caption,dir);      //打开目录,或文件
  except
  exit;
  end;
    //shellexecute(handle,nil,pchar(pathname+'\'+wfile.Selected.Caption ),
      //nil,nil,sw_shownormal)

end;
/////////鼠标在listview上双击时

procedure TListFile.dirClick(Sender: TObject);
begin
  zt.Panels[0].Text:='';
  panel(dir.Selected);
  names:=filename;
  if filename<>'' then
    begin
      filedir(filename+dir.Selected.Text,dir.Selected);
      pathname:=filename+dir.Selected.Text;
    end
  else
    begin
      filedir(dir.Selected.Text ,dir.Selected);
      pathname:=dir.Selected.Text;
    end;
   filename:='';
end;
/////在treeview上单击时

procedure TListFile.dirEdited(Sender: TObject; Node: TTreeNode;
  var S: String);
begin
  if RenameFile(pathname, names+s) then
    zt.Panels[0].Text:='更名成功'
  else
    zt.Panels[0].Text:='更名不成功';
end;
//////在treeview上改名是更改对应的目录名

procedure TListFile.wfileEdited(Sender: TObject; Item: TListItem;
  var S: String);
begin
 if  movefile(pchar(pathname+'\'+wfile.Selected.Caption),pchar(pathname+'\'+s)) then
   zt.Panels[0].Text:='更名成功'
 else
   zt.Panels[0].Text:='更名不成功';
end;///////更改文件的文件名的事件

procedure TListFile.dirKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
Var
  T:TSHFileOpStruct;
  P:String;
begin
  if key=46 then
    begin
      With T do
        Begin
        Wnd:=0;
        wFunc:=FO_DELETE;
        pFrom:=Pchar(pathname);
        pTo:=nil;
        fFlags:=FOF_ALLOWUNDO+FOF_NOCONFIRMATION+FOF_NOERRORUI;//标志表明允许恢复,无须确认并不显示出错信息
        hNameMappings:=nil;
        lpszProgressTitle:='正在删除文件夹...';
        fAnyOperationsAborted:=False;
        End;
        if SHFileOperation(T)=0 then
        begin
          zt.Panels[0].Text:='删除完毕';
          dir.Selected.Delete;
        end
        else
          zt.Panels[0].Text:='删除不成功';
    end;
end;//////删除节点时同时删除对应的目录,用户按了键盘上的[Delete]键.

procedure TListFile.N1Click(Sender: TObject);
var key: word;Shift: TShiftState;
begin
  if dir.Selected.Text='MFD' then
      begin
       showmessage('不可删除根目录');
       exit;
      end
  else
      begin
        key:=46;
        dir.OnKeyUp(sender,key,shift);
      end;
end;////点击tpopupmemu1的删除时。

//end;
/////////////以上是窗体加载时的事件

procedure TListFile.dirCollapsed(Sender: TObject; Node: TTreeNode);
var I:integer;
begin
  for i:=node.Count -1 downto 1 do
    begin
      node.Item [i].Delete ;
    end;
end;
////////当treeview收缩时的事件

procedure TListFile.N6Click(Sender: TObject);
var   f:textfile;
begin
  assignfile(f,pathname+'\'+'新建文件.txt');
  rewrite(f);
  closefile(f);
  listitem:=wfile.Items.Add;
  listitem.Caption:='新建文件.txt';
  listitem.EditCaption;
  filedir(pathname,dir.Selected);
end;////新建文件时。


procedure TListFile.N9Click(Sender: TObject);
begin
wfile.ViewStyle:=vsIcon;
end;

procedure TListFile.l1Click(Sender: TObject);
begin
 wfile.ViewStyle:=vslist;
end;

procedure TListFile.N10Click(Sender: TObject);
begin
wfile.ViewStyle:=vsSmallIcon;
end;

procedure TListFile.N11Click(Sender: TObject);
begin
wfile.ViewStyle:=vsReport;
end;

procedure TListFile.N8Click(Sender: TObject);
begin
  wfile.Selected.EditCaption;
  dir.Refresh;
end;

procedure TListFile.N12Click(Sender: TObject);
begin
  if removedir(pathname+'\'+wfile.Selected.Caption) then
    begin
      filedir(pathname,dir.Selected);
      dir.Selected:=dir.Selected.Parent;
      zt.Panels[0].Text:='删除成功';
    end
  else
    begin
      showmessage('文件夹非空不可删除');
      zt.Panels[0].Text:='删除不成功';
    end;
end;////处理在listview上删除一个对象是删除个文件

procedure TListFile.N13Click(Sender: TObject);
var
searchrec:tsearchrec;
path:string;
begin
   Application.CreateForm(TFormArr, FormArr);
   
   if findfirst(pathname+'\'+wfile.Selected.Caption,faAnyFile,searchrec)=0 then
   begin
   FormArr.Label2.Caption:=inttostr(searchrec.Size)+'b';
   shgetfileinfo(pchar(pathname+'\'+searchrec.Name ),0,fileinfo,sizeof(fileinfo),shgfi_icon);
                 formarr.image1.Picture.Icon.Handle:=fileinfo.hIcon;////返回文件图标
   formarr.Label4.Caption:=datetimetostr(filedatetodatetime(searchrec.Time));
   formarr.Edit1.text:=searchrec.Name;
   formarr.label6.caption:=getcurrentdir()+'\'+pathname;
   //showmessage(inttostr(searchrec.Attr));
   if ((SearchRec.Attr=33)or (searchrec.Attr =3)or
     (searchrec.Attr =1)or (searchrec.Attr =19)
     or (searchrec.Attr =17)or (searchrec.Attr =51))  then formarr.CheckBox1.Checked:=true;       //readonly
   if ((SearchRec.Attr=32)or (searchrec.Attr =33)or
     (searchrec.Attr =34)or (searchrec.Attr =48)
     or (searchrec.Attr =49)or (searchrec.Attr =51))  then formarr.CheckBox2.Checked:=true;    //archive 18
   if ((SearchRec.Attr=16)or (searchrec.Attr =17)or
     (searchrec.Attr =18)or (searchrec.Attr =22)
     or (searchrec.Attr =49)or (searchrec.Attr =48)) then formarr.CheckBox3.Checked:=true;        //dir
   if ((SearchRec.Attr=2)or (searchrec.Attr =3)or
     (searchrec.Attr =18)or (searchrec.Attr =34)
     or (searchrec.Attr =19)or (searchrec.Attr =51))  then formarr.CheckBox4.Checked:=true;        //hide
   end;
   findclose(searchrec);
   FormArr.ShowModal;
end;

end.

⌨️ 快捷键说明

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