- 浏览: 66623 次
- 性别:
- 来自: 杭州
最新评论
-
meimei_123abc:
你好,可以把这个完整的代码给我发一个学习下吗,刚开始接触这一块 ...
在JNI中调用本地带结构体参数的函数 -
yangdong:
sorry,之后一直没再碰过 JNI,没法再写了。
在JNI中调用本地带结构体参数的函数 -
ihopethatwell:
楼主,能写一个传递数组的结构体?
在JNI中调用本地带结构体参数的函数 -
yangdong:
谢谢。我只是追求形似,所以找不到对应的写法。
Stream in Clojure -
jamesqiu:
Clojure的lazy-cat和Scala的Stream实现 ...
Stream in Clojure
我经常会遇到进行批量文件修改的情况。Windows 脚本我十分不精通,以前都是靠现写一个 C# 程序。遇到 Ruby 后,我十分喜欢它语法上的灵活性。(虽然我认为太灵活不一定好)而且它还是一种脚本语言,很方便。考虑到我所遇到的情况,我想写一个类来支持对文件名(文件夹名)或全路径名进行正则表达式匹配。同时也支持反向过滤。即,保留那些没有匹配上的文件或文件夹。
举一个例子。比如用备份工具备份“我的文档”再还原后,很多隐藏文件现在都会显现出来。比如 thumbs.db 和 picasa.ini(因为我用 Google 的 Picasa)。我想把 picasa.ini 重新隐藏起来并删除 thumbs.db。可以这样写:
我认为这样还算是比较容易的吧 如果只是想遍历一下,更简单,直接
FileTree的源代码如下:
有点长,不过一半是注释。如果有的地方的意图看不明白,可以参考下面的测试代码。测试使用与测试代码文件同级的一个“test_folder”文件夹。它的目录结构如下:
C:/netbeans-proj/file_tree/test/test_folder/test
C:/netbeans-proj/file_tree/test/test_folder/test/readme.txt
C:/netbeans-proj/file_tree/test/test_folder/test/src
C:/netbeans-proj/file_tree/test/test_folder/test/src/Assert.java
C:/netbeans-proj/file_tree/test/test_folder/test/src/Entry.java
如果要运行此测试,要先把这个文件结构构造出来才可以。也请保证“test_folder”的上级目录中没有包含src、assert、entry、readme这几个字符串的。不然,测试可能会出问题。
举一个例子。比如用备份工具备份“我的文档”再还原后,很多隐藏文件现在都会显现出来。比如 thumbs.db 和 picasa.ini(因为我用 Google 的 Picasa)。我想把 picasa.ini 重新隐藏起来并删除 thumbs.db。可以这样写:
ftree = FileTree.new("c:\documents and settings\username\my documents") free.traverse( [ /^picasa.ini$/i, /^thumbs.db$/i ], { :entry_type => :file :for_basename_only => true } ) do |file| if file =~ /picasa/i `attrib +h #{file}` else `attrib -s -h -r #{file}` `del #{file}` end end
我认为这样还算是比较容易的吧 如果只是想遍历一下,更简单,直接
FileTree.new("c:\dummy").traverse /file_name_pattern/
FileTree的源代码如下:
# author: Yang Dong # date: 2008-6-15 # # this class is designed to convient the traverse of file trees. you can # just output the whole structure or you can specify some regular expressions # to filter the unwanted files or directories, and customize the actions # against them, plus some additional controls. # # examples to use (based on windows os): # 1) say, you want to see the whole file structure. just write: # FileTree.new("c:\dummy_directory").traverse # # 2) say, you want to hide all the picasa.ini files, write: # ftree = FileTree.new("c:\dummy_dir") # ftree.traverse( # /^picasa.ini$/i, # { # :entry_type => :file, # :for_basename_only => true # } # ) do |file| # `attrib \"#{file}\" -s -h -r` # end class FileTree require "pathname" def initialize(dir) @dir = dir.chomp.gsub(/\\/, '/') pn = Pathname.new(@dir) pn.cleanpath raise "no such directory" unless pn.exist? && pn.directory? end # traverse the given directory. use filter_patterns to specify # what kind of file name you would like to match. attach a # block if you want to give some actions against the matched # files other than just put them out on the standard out. # the block takes one argument indicating the absolute file path # of the matched one. # # the filter_patterns is an array containing regular expression # objects. # # the options give some additional control over filtering. # for details about filter_patterns and options, refer to the # filter method. # # caution: the patterns and actions will not be applied to the root folder # given. def traverse(filter_patterns = nil, options = nil, &block) trav @dir, filter_patterns, options, &block end private def trav(dir, filter_patterns = nil, options = nil, &block) pn = Pathname.new(dir) children = pn.children children.each do |child| if filter(child, filter_patterns, options) if block block.call child.realpath.to_s else puts child.realpath.to_s end end if child.exist? and child.directory? trav child.realpath.to_s, filter_patterns, options, &block end end end # filters the given entry. if entry passed the filter, returns true. # otherwise false. # # the filter_patterns is an array containing regular expression # objects. # # options is a hash which supports the following options: # entry_type: # use this to specify to filter file or directory. if you only want # to do something with files, then use { :entry_type => :file }. # otherwise, use { :entry_type => :dir }. default is nil, which means # either will be okay. # exclude_matched: # specify true to indicate that the matched file entries (including # directories) will not pass the filter. this can be used when you want # to do something with most of the entries in your folder but with some # exceptions. default is set to false. # for_basename_only: # indicates whether the regular expression pattern will be comparing with # the directory or file name only. the default is false, which means not # only the name will be compared, but also the whole path will be # compared. # def filter(entry, filter_patterns = nil, options = nil) # defines a series of default options. options = {} if options.nil? if options[:entry_type] == :file return false unless entry.file? elsif options[:entry_type] == :dir return false unless entry.directory? end filter_patterns = [ // ] if filter_patterns == nil unless filter_patterns.is_a?(Array) filter_patterns = ([] << filter_patterns) end filter_patterns.each do |filter_pattern| if options[:exclude_matched] if options[:for_basename_only] return false if entry.basename.to_s =~ filter_pattern else return false if entry.realpath.to_s =~ filter_pattern end else if options[:for_basename_only] return true if entry.basename.to_s =~ filter_pattern else return true if entry.realpath.to_s =~ filter_pattern end end end if options[:exclude_matched] return true else return false end end end
有点长,不过一半是注释。如果有的地方的意图看不明白,可以参考下面的测试代码。测试使用与测试代码文件同级的一个“test_folder”文件夹。它的目录结构如下:
C:/netbeans-proj/file_tree/test/test_folder/test
C:/netbeans-proj/file_tree/test/test_folder/test/readme.txt
C:/netbeans-proj/file_tree/test/test_folder/test/src
C:/netbeans-proj/file_tree/test/test_folder/test/src/Assert.java
C:/netbeans-proj/file_tree/test/test_folder/test/src/Entry.java
如果要运行此测试,要先把这个文件结构构造出来才可以。也请保证“test_folder”的上级目录中没有包含src、assert、entry、readme这几个字符串的。不然,测试可能会出问题。
require 'test/unit' require "file_tree" class FileTreeTest < Test::Unit::TestCase def setup @root = "#{File.dirname(__FILE__).gsub(/\\/, "/")}/test_folder" @file_tree = FileTree.new(@root) end def test_simple_traverse output = "" @file_tree.traverse do |entry| output += "#{entry}\n" end expected_output = <<TAG #{@root}/test #{@root}/test/readme.txt #{@root}/test/src #{@root}/test/src/Assert.java #{@root}/test/src/Entry.java TAG assert_equal expected_output, output end def test_entry_type output = "" @file_tree.traverse(nil, :entry_type => :file) do |file| output += "#{file}\n" end expected_output = <<TAG #{@root}/test/readme.txt #{@root}/test/src/Assert.java #{@root}/test/src/Entry.java TAG assert_equal expected_output, output ########################################## output = "" @file_tree.traverse(nil, :entry_type => :dir) do |dir| output += "#{dir}\n" end expected_output = <<TAG #{@root}/test #{@root}/test/src TAG assert_equal expected_output, output end def test_exclude_matched output = "" @file_tree.traverse(nil, :exclude_matched => true) do |entry| output += "#{entry}\n" end assert_equal "", output ############################################### output = "" @file_tree.traverse(/src/, :exclude_matched => true) do |entry| output += "#{entry}\n" end expected_output = <<TAG #{@root}/test #{@root}/test/readme.txt TAG assert_equal expected_output, output end def test_for_basename_only output = "" @file_tree.traverse(/src/, :for_basename_only => true) do |entry| output += "#{entry}\n" end expected_output = <<TAG #{@root}/test/src TAG assert_equal expected_output, output end def test_multiple_patterns output = "" @file_tree.traverse [ /assert/i, /readme/i ] do |entry| output += "#{entry}\n" end expected_output = <<TAG #{@root}/test/readme.txt #{@root}/test/src/Assert.java TAG assert_equal expected_output, output end def test_complicated_traverse output = "" @file_tree.traverse( [ /assert/i, /readme/i ], { :entry_type => :file, :exclude_matched => true, :for_basename_only => true } ) do |file| output += "#{file}\n" end expected_output = <<TAG #{@root}/test/src/Entry.java TAG assert_equal expected_output, output end end
评论
2 楼
yangdong
2008-06-16
非常感谢!这个就当是练习了……
1 楼
QuakeWang
2008-06-16
ruby自带find功能就是用来做路径遍历的,不需要自己写
# find.rb: the Find module for processing all files under a given directory.
# The +Find+ module supports the top-down traversal of a set of file paths.
引用
# find.rb: the Find module for processing all files under a given directory.
# The +Find+ module supports the top-down traversal of a set of file paths.
发表评论
-
TimSort 中的核心过程
2011-09-11 20:19 4308TimSort 是 Python 中 list.sor ... -
模拟实现一个 Ruby 的 TCO
2011-05-15 00:24 1048今天搜了一下,发现 ruby 只有一部分 VM 实现支持 TC ... -
解决Ruby脚本在Windows命令行乱码
2011-05-08 16:08 1342如果把 ruby 当脚本使用,在 windows 命令行下面输 ... -
完全由不变体写出来的 Register Machine Simulator
2010-11-19 09:41 1349SICP 第二版 5.2 节提到的 Register Mach ... -
在 Clojure 中处理异常
2010-11-18 23:54 1517Update: As of Clojure 1.3, Cloj ... -
Named arguments in Clojure
2010-11-18 23:54 1093Clojure doesn't provide direct ... -
快速排序
2010-11-18 23:51 1188看了《The Joy of Clojure》的快速排序,觉得比 ... -
求对数
2010-11-18 23:46 1134下面是求以 1.12 为底,2.7 的对数。本方法极其低效,仅 ... -
Stream in Clojure
2010-11-18 23:40 1415(define fibs (stream-cons ... -
[Groovy] this 语义的陷阱
2009-07-30 21:46 967groovy 中 this 的语义有问题。下面的代码会报异常, ... -
两个 JavaScript 面向对象的方法
2008-10-02 07:06 1368准备工作 为了演示或者您试验,请先准备好下面的 HTML 模 ... -
firstChild 把我玩了
2008-07-31 23:23 1345加班两三个小时,就是因为被一个 DWR 的函数给玩了。dwr. ...
相关推荐
实现文件树遍历程序myfind,参照UNIX环境高级编程中的例子
在C++编程中,遍历目录树是一项常见的任务,它涉及到访问和处理文件系统中的文件和子目录。这个过程通常用于文件操作、备份、搜索、清理等场景。下面我们将详细探讨如何在C++中实现这一功能。 遍历目录树的核心在于...
多叉树遍历在许多领域都有应用,如文件系统的遍历、XML文档解析、编译器的语法分析、游戏中的路径查找等。Python的灵活性和丰富的库使其成为实现这些算法的理想选择。 总结,"基于Python的多叉树遍历算法.zip"的...
VFP中TREE树遍历 无限制目录树
在Java编程中,遍历文件目录并生成树结构的文本文件是一个常见的任务,尤其是在处理大量文件数据时。这个任务可以通过使用Java的`java.io.File`类及其相关API来实现。`Dir.class`和`Dir.java`是这次操作的核心文件,...
java全硬盘文件遍历,添加到树中,在面板中显示,没有事件处理
总之,`CTreeCtrl`的目录树遍历是Windows编程中的常见任务,它可以通过循环或递归方式实现。循环遍历简单直观,适用于对所有节点执行相同操作;而递归遍历则更加灵活,能适应更复杂的逻辑。在实际开发中,应根据需求...
通过以上步骤,我们可以构建出一个功能完备的MFC目录树遍历程序。实际开发中,可能还需要考虑性能优化,例如异步遍历目录,以及增加用户界面交互性,如右键菜单、搜索功能等。 在提供的"DirWalk"压缩包中,可能包含...
在Java编程中,多叉树是一种非线性...实际应用中,多叉树常用于搜索引擎的倒排索引、文件系统的目录结构、计算机科学中的语法解析树等多种场景。通过理解多叉树的实现和遍历,可以更好地解决涉及此类数据结构的问题。
在计算机科学中,树是一种非常重要的数据结构,用于表示数据之间的层次关系。树的遍历是研究树结构的关键部分,因为它...这些算法展示了递归在解决树形结构问题中的强大能力,同时强调了理解和熟练掌握树遍历的重要性。
在IT领域,多叉树是一种数据结构,它...总之,多叉树遍历是理解和操作这种数据结构的关键。通过掌握不同类型的遍历方法,我们可以有效地在多种IT场景中利用多叉树解决问题,无论是数据处理、搜索算法还是其他复杂任务。
在实际编程中,树遍历常用于文件系统的目录操作、编译器的语法分析、图的深度优先搜索(DFS)等场景。`graph`这个文件名可能包含了与图遍历相关的代码,因为图的深度优先搜索也可以看作是对树的一种遍历,尤其是在...
在Java编程中,文件遍历和树的遍历是两种常见的操作,它们在处理数据结构和文件系统时显得尤为重要。本教程将详细讲解这两个主题,包括Java如何进行文件遍历,以及如何使用非递归方法实现树的前序、中序和后序遍历。...
例如,在编译器设计中,语法分析阶段会用到树遍历;在文件系统中,目录结构的遍历帮助用户查找和管理文件;在数据库索引中,B树或B+树的遍历可以快速定位数据。 在“树的遍历”这个项目中,学生可能会学习如何使用...
这样可以确保整个目录树都被遍历到。例如,使用Python的os.walk()函数在底层就是通过递归来实现的。 4. 文件查找: 文件查找是指根据特定条件(如文件名、大小、日期等)在文件系统中搜索特定文件的过程。这可以...
树和二叉树是计算机科学中重要的数据结构,它们在算法设计和实现中扮演着核心角色。树是一种非线性的层次结构,其中每个数据...在实际应用中,如文件系统、编译器设计、图形用户界面等都离不开树和二叉树的数据结构。
在提供的压缩包文件"3-11遍历节点树"中,可能包含了一个示例或教程,详细演示了如何使用jQuery进行节点遍历。通过学习和实践这个例子,你将更好地理解这些方法的实际应用。请打开文件进行深入研究,进一步巩固你的...
VC 文件目录遍历生成树菜菜单,生成目录树的VC 源码范例,自动读取指定文件夹下的所有目录和文件,并生成Tree目录树结构。PS注:示例程序读取的是“成绩表”文件夹下的目录和文件,因此在测试时候要把生成的exe从...
在这个例子中,我们遍历目录并将每个文件名封装为一个`<File>`元素,最后将整个XML树写入名为"output.xml"的文件。 请注意,上述代码仅为示例,实际应用中可能需要进行错误处理和数据验证。例如,检查文件路径是否...
在IT领域,多线程遍历磁盘文件是一项常见的任务,尤其在大数据处理、文件管理系统以及备份恢复等场景中。本文将深入探讨如何利用多线程技术高效地遍历包括隐藏文件和系统文件在内的所有磁盘文件。 首先,我们要理解...