xml与目录结构的问题

h98458 2009-07-09 03:48:50
一个目录比如(C:\Program files)目录,怎么遍历生成一个文件保存它的目录结构,然后用treeview读取xml把目录结构显示出来?如下目录(D:\Regmon目录的结构的xml文件)

<?xml version="1.0" encoding="utf-8"?>
<Backup remark="" data="C:\555.data" depend="" time="2009-07-09 15:43:59">
<Dir name="D:\Regmon">
<File speed="rapid" data_part="0" name="D:\Regmon\Regmon.rar" size="213576" start="729420" data="C:\555.data" modifyTime="2009-03-27 11:05:37" attribute=""/>
<File speed="rapid" data_part="0" name="D:\Regmon\REGMON.HLP" size="15031" start="714389" data="C:\555.data" modifyTime="2002-10-22 07:48:00" attribute=""/>
<File speed="rapid" data_part="0" name="D:\Regmon\Regmon.exe" size="707384" start="7005" data="C:\555.data" modifyTime="2006-11-01 13:07:24" attribute=""/>
<File speed="rapid" data_part="0" name="D:\Regmon\Eula.txt" size="7005" start="0" data="C:\555.data" modifyTime="2006-07-28 08:32:44" attribute=""/>
</Dir>
</Backup>


请问如何实现,有源码参考最好
...全文
37 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
h98458 2009-07-13
  • 打赏
  • 举报
回复
完整的代码:
OutXMLDOC:=TXMLDocument.Create(nil);
OutXMLDOC.XML.Clear;
OutXMLDOC.Active:=True;
OutXMLDoc.Encoding:='utf-8';
//根结点
Root:=OutXMLDOC.AddChild('Backup');
Root.Attributes['data']:=IncludeTrailingPathDelimiter(edtDirectory.Text) + edtFileName.Text+'.data';
time:=Now;
Root.Attributes['time']:=FormatDateTime('yyyy-mm-dd hh:nn:ss',time);
DirNode:=Root.AddChild('Dir');
DirNode.Attributes['Name']:=lstSelected.Items.Strings[i];
pSearchFile('D:\ABC');

//-------------------------
procedure pSearchFile(mPath: string);
var
vSearchRec:TSearchRec;
K:Integer;
begin
K:=FindFirst(mPath+'\*.*',faAnyFile,vSearchRec);
while K=0 do
begin
if (vSearchRec.Attr and faDirectory > 0) and (Pos(vSearchRec.Name,'..')=0) then
begin
//是目录则添加一个目录结点
DirNode:=DirNode.AddChild('Dir');
DirNode.Attributes['Name']:=mPath+'\'+vSearchRec.Name;
pSearchFile(mPath+'\'+vSearchRec.Name)
end
else if Pos(vSearchRec.Name,'..')=0 then
begin
//目录下的文件结点
FileNode:=DirNode.AddChild('File');
FileNode.Attributes['Name']:=mPath+'\'+vSearchRec.Name;
FileNode.Attributes['FileSize']:=IntToStr(FileSizeByName(mPath+'\'+vSearchRec.Name));
FileNode.Attributes['data']:=IncludeTrailingPathDelimiter(edtDirectory.Text) + edtFileName.Text+'.data';
FileNode.Attributes['LastWriteTime']:=GetFileTime(mPath+'\'+vSearchRec.Name);
end;
K:=FindNext(vSearchRec);
end;
FindClose(vSearchRec);
end; {pSearchFile}

大家帮看看吧,谢了
haitao 2009-07-13
  • 打赏
  • 举报
回复
如果只要保存目录、文件信息,不一定要求xml
遍历目录,把找到的目录、文件都加到treeview,然后treeview.savetofile
下次读取:treeview.loadfromfile

文件内容是以空格缩进表达层次关系的多行文本
h98458 2009-07-13
  • 打赏
  • 举报
回复
ABC目录的结构为

ABC
|
|_____1
| |
| |
| 1.txt
|
|_____2
| |
| |
| 2.txt
|
|_____abc.txt
h98458 2009-07-13
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="utf-8" ?> 
<Backup data="C:\Documents and Settings\Administrator\桌面\1.data" time="2009-07-13 10:07:21">
<Dir Name="D:\abc">
<Dir Name="D:\abc\1">
<File Name="D:\abc\1\1.txt" FileSize="0" data="C:\Documents and Settings\Administrator\桌面\1.data" LastWriteTime="2009-07-10 10:22:06" />
<Dir Name="D:\abc\2">
<File Name="D:\abc\2\2.txt" FileSize="0" data="C:\Documents and Settings\Administrator\桌面\1.data" LastWriteTime="2009-07-10 10:22:24" />
<File Name="D:\abc\abc.txt" FileSize="0" data="C:\Documents and Settings\Administrator\桌面\1.data" LastWriteTime="2009-07-10 10:22:32" />
</Dir>
</Dir>
</Dir>
</Backup>
-------------------------------------
出来是这样的结果,而我想要的结果是:
-------------------------------------
<?xml version="1.0" encoding="utf-8" ?>
<Backup data="C:\Documents and Settings\Administrator\桌面\1.data" time="2009-07-13 10:07:21">
<Dir Name="D:\abc">
<Dir Name="D:\abc\1">
<File Name="D:\abc\1\1.txt" FileSize="0" data="C:\Documents and Settings\Administrator\桌面\1.data" LastWriteTime="2009-07-10 10:22:06" />
</Dir>
<Dir Name="D:\abc\2">
<File Name="D:\abc\2\2.txt" FileSize="0" data="C:\Documents and Settings\Administrator\桌面\1.data" LastWriteTime="2009-07-10 10:22:24" />
</Dir>
<File Name="D:\abc\abc.txt" FileSize="0" data="C:\Documents and Settings\Administrator\桌面\1.data" LastWriteTime="2009-07-10 10:22:32" />
</Dir>
</Backup>
h98458 2009-07-13
  • 打赏
  • 举报
回复
procedure pSearchFile(mPath: string); 
var
vSearchRec:TSearchRec;
K:Integer;
begin
K:=FindFirst(mPath+'\*.*',faAnyFile,vSearchRec);
while K=0 do
begin
if (vSearchRec.Attr and faDirectory > 0) and (Pos(vSearchRec.Name,'..')=0) then
begin
//是目录则添加一个目录结点
DirNode:=DirNode.AddChild('Dir');
DirNode.Attributes['Name']:=mPath+'\'+vSearchRec.Name;
pSearchFile(mPath+'\'+vSearchRec.Name)
end
else if Pos(vSearchRec.Name,'..')=0 then
begin
//目录下的文件结点
FileNode:=DirNode.AddChild('File');
FileNode.Attributes['Name']:=mPath+'\'+vSearchRec.Name;
FileNode.Attributes['FileSize']:=IntToStr(FileSizeByName(mPath+'\'+vSearchRec.Name));
FileNode.Attributes['data']:=IncludeTrailingPathDelimiter(edtDirectory.Text) + edtFileName.Text+'.data';
FileNode.Attributes['LastWriteTime']:=GetFileTime(mPath+'\'+vSearchRec.Name);
end;
K:=FindNext(vSearchRec);
end;
FindClose(vSearchRec);
end; {pSearchFile}

-------------------------------------
这段生成这样写结果出来不对,高手们能帮我看看吗?
h98458 2009-07-13
  • 打赏
  • 举报
回复
自己解决了
ghd2004 2009-07-09
  • 打赏
  • 举报
回复
不错
hongqi162 2009-07-09
  • 打赏
  • 举报
回复
读写xml这个还不好弄啊,要是不适用xmldocument你直接使用TStringList然后保存成文件,后缀名为xml。


获得文件信息到网上找函数就可以了
bdmh 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 h98458 的回复:]
说白了就是:根据文件夹创建一个包含它里面所有内容(子文件夹和文件名)的XML文件
[/Quote]
这和你遍历有区别吗,既然可以遍历到每个文件夹及其子文件夹和文件,那就是一个写入问题了,delphi自带的xmldocument就行了
h98458 2009-07-09
  • 打赏
  • 举报
回复
说白了就是:根据文件夹创建一个包含它里面所有内容(子文件夹和文件名)的XML文件
bdmh 2009-07-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 h98458 的回复:]
遍历文件夹我知道,就是怎么样遍历后把目录结构生成一个文件保存起来,以便以后读取
[/Quote]
你既然都知道如何遍历了,那就遍历过程中,把目录结构写入文件吧
bdmh 2009-07-09
  • 打赏
  • 举报
回复
月亮换真人版了

用月亮的代码,遍历目录(还有很多方法,可以搜一下),然后写入xml文件就是了
h98458 2009-07-09
  • 打赏
  • 举报
回复
遍历文件夹我知道,就是怎么样遍历后把目录结构生成一个文件保存起来,以便以后读取
hongqi162 2009-07-09
  • 打赏
  • 举报
回复
给你一个遍历文件夹的方法,你参考一下

procedure TForm1.getFileList(Pathname: string);
var
FindData: TWin32FindData;
hf:THandle;
b:boolean;
tmpstr:string;
str:string;
begin
hf := Windows.FindFirstFile(PChar(pathname + '\*.*'), FindData);
if hf = INVALID_HANDLE_VALUE then Exit;
b := true;
while b do
begin
if ( FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY ) = 0 then
begin
str:=string( FindData.cFileName );
self.ListBox1.Items.Add(str);
end
else
begin
tmpstr := FindData.cFileName + '';
if (tmpstr <> '.') and (tmpstr <> '..') then
begin
self.ListBox1.Items.Add(pathname + '\' + FindData.cFileName);
getFileList(pathname + '\' + FindData.cFileName);
end;
end;
b := windows.FindNextFile(hf,FindData);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
self.getFileList('E:\VDR Data');
end;

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧