
删除目录树命令以及该目录下的所有子目录称为目录树。
如果把当前目录比作一颗树的根,那么该目录下的子目录就是这个跟的分支,整个目录包括其子目录从结构上来看就像一颗倒立的树,所以就称为目录树。
在任何一个名字空间中,目录树是指由容器和对象构成的层次结构。树的叶子、节点往往是对象,树的非叶子节点是容器。目录树表达了对象的连接方式,也显示了从一个对象到另一个对象的路径。在活动目录中,目录树是基本的结构,从每一个容器作为起点,层层深入, 都可以构成一棵子树。一个简单的目录可以构成一棵树,一个计算机网络或者一个域也可以构成一棵树。
用递归实现的,不过这样很容易堆栈溢出,
还是选择那个节点,加载那个节点下的内容,好一些。
-----------------------------------------------------------
import javaawtBorderLayout;
import javaioFile;
import javaxswingJFrame;
import javaxswingJScrollPane;
import javaxswingJTree;
import javaxswingtreeDefaultMutableTreeNode;
public class JTreeRoot extends JFrame {
private DefaultMutableTreeNode node = null;
public JTreeRoot() {
JScrollPane scrollPane = new JScrollPane();
getContentPane()add(scrollPane, BorderLayoutCENTER);
node = new DefaultMutableTreeNode("Root");
JTree tree = new JTree(node);
scrollPanesetViewportView(tree);
loadingTree(node);
setSize(650, 500);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
private void loadingTree(DefaultMutableTreeNode root) {
File[] roots = FilelistRoots();
DefaultMutableTreeNode node = null;
for (int i = 0; i < rootslength; i++) {
node = new DefaultMutableTreeNode(roots[i]getPath());
rootadd(node);
loadingTree(roots[i], node);
}
}
private void loadingTree(File root, DefaultMutableTreeNode node) {
File[] files = rootlistFiles();
DefaultMutableTreeNode subNode = null;
if (files == null) {
return;
}
for (int i = 0; i < fileslength; i++) {
Systemoutprintln(files[i]getPath());
subNode = new DefaultMutableTreeNode(files[i]getName());
nodeadd(subNode);
if (files[i]isDirectory()) {
loadingTree(files[i], subNode);
}
}
}
public static void main(String[] args) {
new JTreeRoot();
}
}
目录树是从用户的角度看,硬盘上呈现了一个能够在深度和宽度上广泛延伸的目录树结构。
unix把磁盘块分为三部分超级块,i-节点表,数据区。
i-节点表,存放着所有i-节点信息,每个i-节点信息里都有一个i-节点号,还有一个存放磁盘块号的数组(存放这个i-节点号所指的文件的内容存放的磁盘块号),stat结构(文件属性就放在这)。
其实目录和普通文件的内容都放在磁盘块上(数据区分成若干的磁盘块,每块都有编号)。
这样普通文件和目录怎么区分呢?
stat结构里有标志位区分i-节点所指的文件是普通文件,目录,块文件,字符文件,管道文件,还是套接字文件。
目录里只存放文件名与i-节点号。这样通过文件名--------> i-节点号---------> 磁盘块号-------->读;
就能读相应的文件里的内容
详细内容可以参考《unix环境高级编程》414章节
关于学习linux或者unix不建议泡论坛,建议看书,多看多写,有了难题去发帖,csdn,chinaunix都挺好的。
'设置 Treeview 控件属性。
TreeView1LineStyle = tvwRootLines ' Linestyle 1
'添加 Node 对象。
Dim nodX As Node '声明 Node 变量。
'带有文本 'Root' 的第一个节点。
Set nodX = TreeView1NodesAdd(, , "r", "班级名称")
'下一个节点是节点 1 ("Root") 的子节点。
Call TreeView1NodesAdd("r", tvwChild, "class2007", "2007级")
Call TreeView1NodesAdd("r", tvwChild, "class2008", "2008级")
Call TreeView1NodesAdd("r", tvwChild, "class2009", "2009级")
步骤如下:
选定1-30行,数据——组及分级显示——组合。
再选定9-18行,同样 数据——组及分级显示——组合。
再选定其他各组,同样做法。
目录树:在任何一个名字空间中,目录树是指由容器和对象构成的层次结构。树的叶子、节点往往是对象,树的非叶子节点是容器。目录树表达了对象的连接方式,也显示了从一个对象到另一个对象的路径。
可参考如下信息:
树形控件是以树形结构表达元素的方式,是比较常用的控件之一,在WPF控件库中,同样提供了树形控件--TreeView。
在WPF中,TreeView控件只是提供显示容器,具体的节点通过TreeViewItem完成,TreeView控件的Items属性表示了它所包含的子节点。TreeViewItem控件是一个可递归的控件,它也用Items属性表示子节点,层层深入,构成一个完整的树形结构。
可以通过TreeView控件的Items属性添加和删除它的子节点,Items属性的每个元素都是object类型,所以可以包含任意类型的元素,TreeView在显示时会自动通过元素的ToString()方法获取要显示的文本。在这一点上TreeViewItem和TreeView是完全一致的。
TreeView控件不包含节点展开和收拢事件(这和Win Form窗体中的Tree控件不同),它包含SelectedItemChanged事件,用来监视树形结构中选中节点的变化。
TreeViewItem控件具有展开(Expanded)事件和收拢(Collapsed)事件,通过这两个事件可以监视节点的展开和收拢,并给出相应的处理。
在TextReader实例中,要显示目录和文件结构,需要用一种典型的树状结构,所以TreeView控件是首选。本例通过以下思路来完成目录的动态加载:
(1)文件系统中的目录和文件都作为TreeView控件中的节点,用TreeViewItem空间表示,而目录和文件的详细路径则保存在TreeViewItemTag属性中。
(2)在窗体启动时加载 *** 作系统中所有的逻辑分区(例如,C:\、D:\等),实际上它们都是目录。
(3)监视树中节点的Expanded事件,如果是一个目录第一次展开,则加载该目录下直接的所有子目录和文件,不包括子目录的子目录和文件。
(4)监视TreeView控件的SelectedItemChanged事件,并根据当前选中节点的路径获取目录或文件的详细属性,并显示到界面上。
(5)当双击TreeView控件中的节点时,如果节点是文件,则判断文件类型;如果节点是文本格式文件,则将文本内容加载到界面上。
示例代码9-18是TextReader中与TreeView控件有关的代码,其中LoadLogicDrive()方法将系统中的逻辑分区信息加载到TreeView控件中,LoadDicTree()方法则将选中目录中的子目录和文件加载到该目录节点下。Dic_Expanded()是所有目录节点的Expanded事件处理函数,它首先判断该目录是不是第一次展开,如果是则加载该目录下的信息,否则不加载。
示例代码9-18:
namespace FileViewer{/// <summary>/// Window1xaml 的交互逻辑/// </summary>public partial class WndMain : Window{public WndMain( ){InitializeComponent( );}
/// <summary>/// 加载指定目录下的文件和目录/// </summary>/// <param name="tv">要展开的目录</param>/// <returns>true则表示加载成功</returns>private bool LoadDicTree(TreeViewItem tvi){tviItemsClear( ); //清除原有的所有节点(第一次展开标记) //获取目录路径string dicStr = ((string) tviTag)Trim( );if (DirectoryExists(dicStr)) //如果目录存在{//获取目录信息DirectoryInfo dicInfo = new DirectoryInfo(dicStr);//遍历目录中所有子目录foreach (DirectoryInfo item in dicInfoGetDirectories()){//如果为系统目录,则不显示到界面if ((itemAttributes & FileAttributesSystem) == FileAttributesSystem)continue;//创建TreeViewItem对象TreeViewItem tviDic = new TreeViewItem( );//保存目录路径到Tag属性tviDicTag = itemFullName;//设置节点显示文本tviDicHeader = itemName;//节点添加一个子节点"tmp"作为第一次展开标记tviDicItemsAdd("tmp");//添加节点Expanded事件处理函数tviExpanded += new RoutedEventHandler(thisDic_Expanded);//将节点添加到该父目录下tviItemsAdd(tviDic);}//遍历目录中所有子文件foreach (FileInfo item in dicInfoGetFiles()){//创建TreeViewItem对象TreeViewItem tviFile = new TreeViewItem( );//保存文件路径到Tag属性tviFileTag = itemFullName;//设置节点显示文本tviFileHeader = itemName;//将节点添加到父目录下tviItemsAdd(tviFile);}return true;}else //目录不存在,不处理{return false;}}
//加载系统中逻辑分区信息到目录树private void LoadLogicDrive( ){//遍历所有逻辑分区foreach (string drv in DirectoryGetLogicalDrives()){//创建TreeViewItem对象TreeViewItem tvi = new TreeViewItem( );//将分区路径保存到Tag属性 tviTag = drv;//设置节点显示文本tviHeader = drv;//添加节点Expanded事件处理函数tviExpanded += new RoutedEventHandler(thisDic_Expanded);//是目录,则添加"tmp"字符串子节点,用作第一次展开标记tviItemsAdd("tmp"); //将节点添加到目录树thistvDicItemsAdd(tvi); }}
//窗体加载事件处理函数private void Window_Loaded(object sender, RoutedEventArgs e){thistvDicItemsClear( ); //清除目录树中所有节点thisLoadLogicDrive( ); //加载 *** 作系统中所有逻辑分区}
//节点展开事件处理函数void Dic_Expanded(object sender, RoutedEventArgs e){//获取展开的节点TreeViewItem tvi = (TreeViewItem) eSource;if (tviTag == null) //如果节点不带有Tag数据,则返回{return;}if ((tviItemsCount == 1) && //如果节点Tag数据是string类型且为"tmp"(tviItems[0] is string) && //则是第一次展开,则加载子目录等信息到树形结构中((string) tviItems[0] == "tmp")){thisLoadDicTree(tvi); //加载目录的子目录和文件}}
//选中文件或目录发生变化事件处理函数privatevoidtvDic_SelectedItemChanged(objectsender,RoutedPropertyChangedEventArgs <object> e){//获取该节点的路径string dicStr = (string)((TreeViewItem) thistvDicSelectedItem)Tag;if (DirectoryExists(dicStr)) //是一个目录{//显示属性面板thistabViewVisibility = VisibilityVisible;//获取目录信息DirectoryInfo dicInfo = new DirectoryInfo(dicStr);string hint = ""; //生成目录属性文本hint += stringFormat("目 录: {0}\n", dicInfoName);hint += stringFormat("路 径 {0}\n", dicInfoFullName);hint += stringFormat("根 目 录: {0}\n", dicInfoRoot);hint += stringFormat("父 目 录: {0}\n", dicInfoParent);hint += stringFormat("子 目 录 数: {0}\n", dicInfoGetDirectories( )Length);hint += stringFormat("文 件 数: {0}\n", dicInfoGetFiles( )Length);hint += stringFormat("创 建 时 间: {0}\n", dicInfoCreationTime);hint += stringFormat("最近访问时间: {0}\n", dicInfoLastAccessTime);hint += stringFormat("最近修改时间: {0}\n", dicInfoLastWriteTime);hint += stringFormat("目 录 属 性: {0}\n", dicInfoAttributes);thistbPropText = hint; //显示目录属性到界面}else if (FileExists(dicStr)) //是一个文件{//显示属性面板thistabViewVisibility = VisibilityVisible;//获取文件属性FileInfo fileInfo = new FileInfo(dicStr);string hint = ""; //生成文件属性文本hint += stringFormat("文 件 名: {0}\n", fileInfoName);hint += stringFormat("完 整 路 径: {0}\n", fileInfoFullName);hint += stringFormat("扩 展 名: {0}\n", fileInfoExtension);hint += stringFormat("父 目 录: {0}\n", fileInfoDirectory);hint += stringFormat("创 建 时 间: {0}\n", fileInfoCreationTime);hint += stringFormat("最近访问时间: {0}\n", fileInfoLastAccessTime);hint += stringFormat("最近修改时间: {0}\n", fileInfoLastWriteTime);hint += stringFormat("文 件 属 性: {0}\n", fileInfoAttributes);thistbPropText = hint; //显示文件属性到界面}else{ //不是文件也不是目录,隐藏属性面板thistabViewVisibility = VisibilityHidden;}}
//目录树双击事件处理函数private void tvDic_MouseDoubleClick(object sender, MouseButtonEventArgs e){//获取双击发生的节点TreeViewItem tvi = (TreeViewItem) thistvDicSelectedItem;
if (tvi == null) //如果节点为空,返回{return;}
if (tviItemsCount > 0) //是目录,不是文件,返回{return;}
string fileName = (string) tviTag; //获取文件名if (!FileExists(fileName)) //文件不存在,返回{return;} //获取文件信息FileInfo fInfo = new FileInfo(fileName);//根据后缀名判断是否为文本格式的文件switch (fInfoExtensionToUpper( )) {case "TXT": //文本文件case "LOG": //日志文件case "INI": //ini配置信息case "XML": //xml文件case "XAML": //xaml代码文件case "BAT": //批处理文件case "CPP": //C++代码文件case "C": //C代码文件case "H": //C、C++头文件case "CS": //C#代码文件case "VB": //VB代码文件case "HTML": //Html网页代码文件case "ASPX": //ASPNET代码文件case "VBS": //VBScript代码文件case "JS": //JavaScript代码文件case "CSS": //CSS格式定义文件case "SLN": //VS解决方案文件thisViewTxtFile(fileName); //加载文本文件到界面上break;case "RTF":thisViewRtfFile(fileName); //加载rtf文件到界面上break;default://提示不支持的文件格式MessageBoxShow("暂时还不支持该类型文件查看!", "提示",MessageBoxButtonOK, MessageBoxImageInformation);break;}}}}
实例TextReader中目录树的运行效果如图9-13所示,其中,界面左边是目录树,没有展开的目录也没有加载任何信息,只有在第一次展开之后才会加载具体的目录信息。界面右边的属性页面显示了当前选中文件或目录的详细属性,通过代码中的tvDic_SelectedItem Changed()方法实现。
(大图)图9-13 TextReader目录树运行效果
技巧:在实例TextReader中,目录树加载之所以分目录进行加载,主要是为了提高效率,一次性加载所有目录信息需要等待很长时间,而且并不是所有目录信息都会用到,真正使用的其实是很少的一部分。
以上就是关于目录树是什么全部的内容,包括:目录树是什么、用JTree编写的文件目录树、linux学习问题,关于i-node,及目录树的概念。望各位老鸟见教,另需推荐一些气氛好的linux学习社区或论坛等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)