unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    Panel1: TPanel;
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{函数的默认参数是指定显示在第几个元素下面}
function DirToTree(Tree: TTreeView; Path: string; num: Integer = -1): Boolean;
var
  sr: TSearchRec;
  node: TTreeNode;
begin
  path := ExcludeTrailingPathDelimiter(path); {去掉最后一个 '\'}
  if not DirectoryExists(path) then Exit;     {路径不存在则退出}
  if num = -1 then node := nil else node := Tree.Items[num]; {确认节点}

  if FindFirst(Path + '\*.*', faAnyFile, sr) = 0 then
  begin
    repeat
      if sr.Name[1] = '.' then Continue;      {如果是'.' 或 '..' (当前目录或上层目录)则忽略}

      Tree.Items.AddChild(node, sr.Name);     {都是通过这句添加的}

      Application.ProcessMessages;            {加上可以让程序兼顾其他消息}

      {如果是文件夹则执行递归}
      if (sr.Attr and faDirectory) = faDirectory then
        DirToTree(Tree, Path + '\' + sr.Name, Tree.Items.Count-1);
    until (FindNext(sr) <> 0);
  end;
  Result := True;
end;

{测试}
procedure TForm1.Buttonunit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    Panel1: TPanel;
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{函数的默认参数是指定显示在第几个元素下面}
function DirToTree(Tree: TTreeView; Path: string; num: Integer = -1): Boolean;
var
  sr: TSearchRec;
  node: TTreeNode;
begin
  path := ExcludeTrailingPathDelimiter(path); {去掉最后一个 '\'}
  if not DirectoryExists(path) then Exit;     {路径不存在则退出}
  if num = -1 then node := nil else node := Tree.Items[num]; {确认节点}

  if FindFirst(Path + '\*.*', faAnyFile, sr) = 0 then
  begin
    repeat
      if sr.Name[1] = '.' then Continue;      {如果是'.' 或 '..' (当前目录或上层目录)则忽略}

      Tree.Items.AddChild(node, sr.Name);     {都是通过这句添加的}

      Application.ProcessMessages;            {加上可以让程序兼顾其他消息}

      {如果是文件夹则执行递归}
      if (sr.Attr and faDirectory) = faDirectory then
        DirToTree(Tree, Path + '\' + sr.Name, Tree.Items.Count-1);
    until (FindNext(sr) <> 0);
  end;
  Result := True;
end;

{测试}
procedure TForm1.Button1Click(Sender: TObject);
begin
  TreeView1.Items.Clear;
  DirToTree(TreeView1, Edit1.Text);
end;

end.
1Click(Sender: TObject);
begin
  TreeView1.Items.Clear;
  DirToTree(TreeView1, Edit1.Text);
end;

end.