`
yianpuodiaotu
  • 浏览: 241563 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

目录树的生成

 
阅读更多

项目上线需要生成个目录树文件,本来可以用dos的tree就搞定的,领导非得要统计每个文件下的子文件数目。没办法,只好找了点资料随便写了个JFrame。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Stack;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class PathTree extends JPanel {
	private static final long serialVersionUID = 1L;
	private JButton browseButton = new JButton("选择文件夹");
	private JTextArea pathsTextArea = new JTextArea();

	public PathTree() {
		initGui();
	}

	// 初始化界面
	private void initGui() {
		this.setLayout(new BorderLayout());
		JPanel buttonsPanel = new JPanel();
		buttonsPanel.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0,
				Color.GRAY));
		buttonsPanel.add(browseButton);
		this.add(buttonsPanel, BorderLayout.NORTH);
		JScrollPane scroller = new JScrollPane(pathsTextArea);
		scroller.setBorder(null);
		this.add(scroller, BorderLayout.CENTER);
		browseButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// 选择文件夹
				final JFileChooser chooser = new JFileChooser();
				chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
				int result = chooser.showOpenDialog(PathTree.this);
				if (result == JFileChooser.APPROVE_OPTION) {
					Thread t = new Thread(new Runnable() {
						public void run() {
							File dir = chooser.getSelectedFile();
							pathsTextArea.setText("");
							WorkTree workTree = new WorkTree(dir);
							workTree.tree();
							pathsTextArea.setText(workTree.getResult());
						}
					});
					t.start();
				}
			}
		});
	}

	// 创建主窗口
	private static void createGUIAndShow() {
		JFrame frame = new JFrame("目录结构树");
		frame.setContentPane(new PathTree());
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Dimension ss = Toolkit.getDefaultToolkit().getScreenSize();
		int w = 600;
		int h = 700;
		int x = (ss.width - w) / 2;
		int y = (ss.height - h) / 2 - 40;
		x = x > 0 ? x : 0;
		y = y > 0 ? y : 0;
		frame.setBounds(x, y, w, h);
		frame.setVisible(true);
	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				createGUIAndShow();
			}
		});
	}

}

class WorkTree {
	private File root;
	private StringBuffer resultBuffer = new StringBuffer();

	public WorkTree(File root) {
		this.root = root;
	}

	public String getResult() {
		return resultBuffer.toString();
	}

	public WorkTree(String rootName) {
		this(new File(rootName));
	}

	public void tree() {
		Stack<Boolean> lastStack = new Stack<Boolean>();
		tree(root, 0, lastStack);
	}

	private void tree(File dir, int level, Stack<Boolean> lastStack) {
		if (dir == null || !dir.exists()) {
			return;
		}
		// 输出
		printFile(dir, level, lastStack);

		if (dir.isFile()) {
			return;
		}
		File[] children = dir.listFiles();
		for (int i = 0; i < children.length; i++) {
			lastStack.push(i == children.length - 1);
			tree(children[i], level + 1, lastStack);
			lastStack.pop();
		}
	}

	/**
	 * 打印树形文件目录
	 * 
	 * @param file
	 *            文件
	 * @param level
	 *            文件所处的层级
	 * @param lastStack
	 *            该文件是否是最后一个文件
	 */
	private void printFile(File file, int level, Stack<Boolean> lastStack) {
		for (int i = 0, k = lastStack.size() - 1; i < k; i++) {
			resultBuffer.append(lastStack.get(i) ? "\t" : "│\t");
		}
		if (level > 0) {
			resultBuffer.append(
					lastStack.get(lastStack.size() - 1) ? "└─" : "├─");
		}

		String fileName = file.isDirectory() == true ? (file.getName() + dirMarks(file))
				: file.getName();

		resultBuffer.append(level == 0 ? file.getPath() : fileName)
				.append("\n");
	}

	private static String dirMarks(File file) {
		int files = 0;
		int dirs = 0;
		File[] curFileList = file.listFiles();
		for (int i = 0; i < curFileList.length; i++) {
			File temp = curFileList[i];
			if (temp.isFile()) {
				files++;
			} else {
				dirs++;
			}
		}
		return " " + "子目录" + dirs + "个,文件" + files + "个";
	}
}

 

效果还不错:



 

  • 大小: 17.1 KB
分享到:
评论

相关推荐

    百度网盘目录树生成器v2.0版本

    标题“百度网盘目录树生成器v2.0版本”涉及到的是一个专为百度网盘设计的工具,其主要功能是帮助用户生成网盘内的目录树结构。这个工具是基于Python编程语言编写的,并且已经打包为Windows可执行文件(exe),方便在...

    文件目录树生成器

    "文件目录树生成器"是一种实用工具,它能够帮助用户快速地整理和记录计算机中某个特定目录下的所有文件和子目录结构。这个程序通常用于批量处理文件管理任务,例如在备份、迁移或分析大量文件时,能清晰地了解文件...

    文件夹目录树一键生成器v1.3.0

    这个程序是一个文件夹目录树生成器,它可以帮助你生成文件夹的目录树并保存到TXT文本文件中。主要功能如下: 选择文件夹:你可以通过点击菜单栏中的“文件”菜单,然后选择文件夹来指定要生成目录树的文件夹路径。...

    Windows下生成目录树的BAT程序

    `cmdtree.bat`是一个简单的目录树生成程序,它默认在D盘根目录生成一个名为`tree.txt`的文本文件,用于保存生成的目录树结构。使用这个程序时,你需要将它移动到你需要生成目录树的文件夹下,然后双击运行。执行后,...

    DELPHI实现数据库目录树生成

    标题“DELPHI实现数据库目录树生成”涉及的是在Delphi编程环境中,使用特定技术来构建一个能够展示数据库数据的多级目录树视图。这个功能对于数据管理和浏览尤其有用,比如在文件管理系统或者数据库查询工具中,用户...

    dgn-mlsc目录树生成 绿色软件

    在IT行业中,"dgn-mlsc目录树生成 绿色软件"是一个关于文件管理和自动化工具的话题。这个软件主要用于创建和管理计算机中的目录结构,即文件夹和子文件夹的层次表示,通常以树状的形式展示。让我们深入探讨这个主题...

    根据目录生成XML文件,根据xml目录树生成目录

    接下来,我们讨论如何根据XML目录树生成目录。这通常涉及以下操作: 1. **解析XML**:读取XML文件并解析其内容,生成一个DOM(Document Object Model)树或使用XML解析器如SAX(Simple API for XML)进行事件驱动的...

    目录树生成工具

    基于JavaFX的目录树生成工具。生成工具类使用了https://github.com/GourdErwa/MyNote/blob/master/util/src/main/java/com/gourd/erwa/util/DirectoryTreeV1.java提供的工具类。

    百度网盘生成目录树结构.zip

    而“百度网盘生成目录树结构”则是一种优化资源管理的方法,尤其对站长和内容创作者而言,能够更清晰地展示文件的层级关系,提高工作效率。 首先,我们要理解什么是目录树结构。目录树结构是计算机科学中的一个基本...

    百度网盘目录树生成器+网页生成器

    非常适合做虚拟产品的用户购买,提升自己的购买率!...一共有两个软件,第一个将百度网盘的目录导出成txt格式的目录树,第二个软件将txt的内容快速生成有折叠功能的目录的网页,上传到服务器后方便查看。

    目录树生成

    根据所选择的文件夹路径,生成对应的目录树

    百度网盘文件夹目录生成软件,一键生成百度云盘的文件及文件夹树形目录结构。自己再结合excel进行编辑,很精美的目录就有了

    本篇文章将深入探讨如何使用特定的软件工具来高效地生成并编辑百度网盘的文件和文件夹的树形目录结构。 首先,标题提到的“百度网盘文件夹目录生成软件”是一个专门设计用于自动化生成百度网盘内文件和文件夹结构的...

    自动生成文件夹目录树

    自动生成文件夹目录树,方便使用EXCEL用户

    教你导出百度网盘目录树

    在Excel中,你可以通过VBA(Visual Basic for Applications)编写脚本来生成目录树结构。VBA是Excel内置的一种编程语言,可以自动化执行任务。上述代码示例中,通过遍历数据行,检查父目录变化,利用字符串分割函数...

    多功能生成目录树的程序

    3. **DirTree.exe** - 这是可执行文件,是程序的主要部分,当用户双击运行时,将启动目录树生成程序。它的名字“DirTree”直接对应于“目录树”的概念,意味着它是程序的核心,负责解析文件系统,创建并显示目录树。...

    目录生成器.zip

    在本案例中,这两个bat脚本(目录树生成器(xls版).bat和目录树生成器(txt版).bat)是用来遍历指定文件夹内的所有子文件夹和文件,并将结果分别以xls(Excel表格)和txt(纯文本)格式输出。 txt版的目录树生成器...

    Listit 1.0b3 英文版 目录树生成

    Listit是一个和windows下面的tree命令实现相同功能的目录列表软件。 绿色软件,直接拷贝,无需安装/卸载,直接拷贝/删除。 该软件是免费的,你可以随意使用、传播该软件。 它比tree更方便、更强大,支持Win95/98/me/...

    C#表达式目录树vs实用插件

    2. 代码生成:某些插件允许你直接从表达式目录树生成源代码,这对于快速创建动态方法或Linq查询非常方便。 3. 动态调试:在调试过程中,你可以使用插件查看当前表达式的目录树,从而更好地理解代码的执行过程。 4. ...

    使用python生成目录树

    此程序实现了一个简单的目录树生成器,能够根据目录结构创建层次清晰的文本表示。然而,这种方法的一个限制是它仅适用于文本输出,不适合于图形化展示。对于更复杂的目录树显示,如树形视图,可以考虑使用第三方库,...

    文件夹目录树自动生成工具,可查看,可跳转

    标题中的“文件夹目录树自动生成工具”是一个用于自动化生成文件系统目录结构的程序,它可以帮助用户快速地创建一个包含所有文件和子文件夹的详细列表。这种工具在日常工作中非常有用,特别是在需要管理和整理大量...

Global site tag (gtag.js) - Google Analytics