没有扫描子文件夹;
最好不要使用递归,在文件夹比较多的情况下容易溢出;
可以使用队列算法;
将扫描到是文件夹的加入到一个TStringList中;
以后每次取出一个扫描子文件,扫到是文件夹继续加入到TStringList中;
直到TStringList中没有对象为止。

解决方案 »

  1.   

    不需要递归,你的做法是正确的。你的问题在于调用
     if (HasChildren(Data^.s_name)) then
        Include(InitialStates, ivsHasChildren);
    时,Data^.s_name只是文件名,不含路径,所以HasChildren找不到。建议:
    TData = record
        s_name: string; // 文件名
        s_leng: string; // 文件大小
        s_type: string; // 文件类型
        s_FullName: string; // 文件名含路径
      end;在InitChildren事件中
      if FindFirst(IncludeTrailingBackslash(Data^.s_name) + '*.*', faAnyFile, SR) = 0 then
    改为
      if FindFirst(IncludeTrailingBackslash(Data^.s_FullName) + '*.*', faAnyFile, SR) = 0 then
    并增加给FullName赋值语句
              ChildData^.s_FullName := IncludeTrailingBackslash(Data^.s_FullName) + ChildData^.s_name;另外在InitNode中增加给FullName赋值语句
    Data := Sender.GetNodeData(Node);
      if ParentNode = nil then
      begin
        Data^.s_name := strpas(strupper(pchar(AppPath)));
        Data^.s_leng := '0';
        Data^.s_type := 'Directory';
        Data^.s_Fullname := strpas(strupper(pchar(AppPath)));
      end;
      if (HasChildren(Data^.s_Fullname)) then
        Include(InitialStates, ivsHasChildren);
      

  2.   

    VirtualStringTree不需要一次性把数据全取出,只需要判断子目录是否有文件,改变ivsHasChildren标志,这样在树上就有个加号标志。按加号时再取下级子目录的文件。
    所以你的问题只是判断子目录的取子目录文件需要用含全路径的文件名