JHHK

欢迎来到我的个人网站
行者常至 为者常成

Dir介绍

目录

概览

获取当前路径和修改当前工作目录
    Dir.pwd -> string
    #接受一个可选参数,成功返回0。不指定string切换到HOME目录
    Dir.chdir( [ string] ) -> 0 

目录是否存在和创建删除一个目录
    Dir.exist?(file_name)   ->  true or false
    Dir.mkdir( string [, integer] ) -> 0
    Dir.delete( string ) -> 0
    # 创建一个Dir实例对象
    Dir.new( string ) -> aDir

获取子目录
    Dir.entries( dirname )  -> array
    Dir.children( dirname ) -> array
    Dir.foreach('./') do |entry| end

根据指定的模式匹配文件路径
    files = Dir.glob('./**/*.txt', File::FNM_CASEFOLD)

详细

class XYDir

    # 获取当前路径
    def usage1
       pwd = Dir.pwd;
       # /Users/lixiaoyi/LXYFile/ResourceInCoding/HelloRuby
       puts pwd
    end


    # 返回指定路径下所有文件和子目录的数组,包括 '.' 和 '..'
    def usage2
        entries = Dir.entries('./')
        # entries.class = Array, entries = [".", "..", "bin", "README.md", ".gitignore", "lib", "Gemfile", "Gemfile.lock", ".git", ".vscode"]
        puts "entries.class = #{entries.class}, entries = #{entries}"

        # 也是返回子目录,不包括 .. 和 .
        children = Dir.children './'
        puts "children = #{children}"
    end


    # 遍历指定路径下的所有文件和子目录,对每个条目执行块中的操作
    def usage3
        Dir.foreach('./') do |entry|
            puts "entry = #{entry}"
        end
        # entry = .
        # entry = ..
        # entry = bin
        # entry = README.md
        # entry = .gitignore
        # entry = lib
        # entry = Gemfile
        # entry = Gemfile.lock
        # entry = .git
        # entry = .vscode
    end


    def usage4
        if Dir.exist?("./mytest")
            puts "目录存在"
            # 改变当前工作目录到指定路径
            Dir.chdir('./mytest')
            cur = Dir.pwd
            puts "cur = #{cur}"

            Dir.chdir("../")
            cur = Dir.pwd
            puts "cur = #{cur}"

            # 删除一个空目录
            # Dir.rmdir('./mytest')
            # entries = Dir.entries './'
            # puts "entries = #{entries}"

            # 删除一个空目录
            # Dir.delete('./mytest')
            # entries = Dir.entries './'
            # puts "entries = #{entries}"

            # 删除一个目录及其内容
            # FileUtils.rm_r('./mytest')
            # entries = Dir.entries './'
            # puts "entries = #{entries}"
        else
            puts "目录不存在"
            # 创建一个目录
            Dir.mkdir('./mytest')
            entries = Dir.entries './'
            puts "entries = #{entries}"
        end
    end


    # 根据指定的模式匹配文件路径。
    def usage5 
        # 创建目录
        self.usage4

        # Dir.glob(pattern, [flags])
        # pattern: 匹配的模式,可以包含通配符和正则表达式
        # flags: 可选参数,可以指定一些标志,用于修改匹配行为
        # File::FNM_CASEFOLD 用于忽略大小写
        files = Dir.glob('./**/*.txt', File::FNM_CASEFOLD)
        puts "files = #{files}"
    end

    # 创建一个dir对象
    def usage6
        # Dir.new 的好处之一是,你可以创建多个 Dir 对象来表示不同的目录,而无需不断更改当前工作目录。
        # 这使得在处理多个目录时,代码更加模块化和易读。
        dir = Dir.new './'
        puts dir.children
        puts '------------'
        puts dir.entries
        puts '------------'
        dir.entries.each do |entry|
            puts "entry = #{entry}"
        end
    end

    # 查找某个目录下是否存在某个文件
    # 如果当前目录找不到,会向父目录查找,直到找到根目录 /
    def searchFile dir, filename
        if Dir.new(dir).children.include? filename
            return [true, dir]
        elsif dir == "/"
            return [false, "/"]
        else
            next_path = File.expand_path("..", dir)
            return searchFile next_path, filename
        end
    end


    def execCMD cmds = []
        # ruby ./mytest/test.rb cmd1 cmd2
        result = self.searchFile "./mytest", "test.rb"
        if result.first 
            rbfilePath = File.expand_path "test.rb", result[1]
            cmdStr = ""
            cmds.each do |cmd|
                if cmd.include? " "
                    cmd = "\"" + cmd +"\""
                end
                cmdStr = cmdStr + " " + cmd
            end
            # puts "all = #{rbfilePath}  #{cmdStr}"
        end

        
        # 当你传递一个字符串给 system 时,它会将这个字符串作为命令在系统 shell 中执行
        # 执行成功返回true, 执行失败返回false
        # result = system "ruby #{rbfilePath} #{cmdStr}"

        # 也可以这么写
        result = system "ruby", rbfilePath, cmdStr

        if result 
            puts "指令执行成功"
        else
            puts "指令执行失败"
        end
    end


    def self.show
        xyDir = XYDir.new
        # xyDir.usage6

        # arr = xyDir.searchFile "./", ".cocoapods"
        # puts "arr = #{arr}"

        xyDir.execCMD
        # xyDir.execCMD ["arg1", "arg2"]
    end

end

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.