检查具有特定扩展名的文件的目录

时间:2012-10-18 02:33:57

标签: ruby file directory file-extension

我正在尝试检查通过命令行输入的目录是否包含具有特定文件扩展名的文件。例如,如果我有一个文件夹“Folder1”,其中包含另一个文件夹“Folder 2”,Folder2包含多个文件,“test.asm”,“test.vm”,“test.tst”。我正在通过命令行获取目录或文件,如此

ruby translator.rb Folder1/Folder2

ruby translator.rb Folder1/Folder2/test.vm

我要做的是错误检查。我已经检查输入是否是文件夹,现在我需要检查文件夹是否实际包含.vm文件。 到目前为止我所做的是:

require 'pathname'

pn = Pathname.new(ARGV[0])

if ARGV.size != 1
    puts "Proper usage is: ruby vmtranslator.rb file_directory\file.vm \nOR \nruby vmtranslator.rb file_directory\ where file_directory has multiple vm files test".split("\n")
elsif !pn.exist? && !pn.directory?
    puts "Something is wrong with the file"
    puts "Either try another file or check the file extension"
elsif pn.directory? && pn.children(false).extname.include?('.vm')
    puts "this should print if Folder1 is the folder, but not if Folder2 is.."
    vm_file1 = File.open("OPEN FILES WITH .vm AS EXTENSION)
elsif pn.exist? || pn.file?
    puts "this is right"
    vm_file = File.open(ARGV[0], "r")
    asm_file = File.new(ARGV[0].sub('.vm', '.asm'), "w")
end

那么应该做的是检查首先是否只有一个参数,如果是,那么它会检查它是否是文件或目录,否则它会输出错误,那么我正在做的是检查它是否是一个目录。如果是这样,我需要检查目录是否实际包含.vm文件。我尝试pn.each_child {|f| f.extname == '.vm'},但只检查第一个值,然后才返回true。除了设置一些布尔值之外,还有更简单的方法来检查整个数组吗?

那里的一些代码没有完成,我只是问是否有办法检查目录中是否有某个扩展名的文件。到目前为止,我找不到任何搜索内容。

3 个答案:

答案 0 :(得分:4)

str = ARGV[0]

proc = ->(f) { puts "doing something with #{f.path}" }

if Dir.exists?(str)
  Dir.glob(File.join(str, File.join('**', '*.vm'))).each do |entry|
    proc[File.open(entry)]
  end
elsif File.exists?(str) && File.extname(str) == '.vm'
  proc[File.open(str)]
else
  puts "couldn't do anything with #{str}"
end

答案 1 :(得分:1)

Dir["Folder1/Folder2/*.vm"].empty?
如果false中有.vm个文件,

将返回Folder1/Folder2

答案 2 :(得分:1)

require 'pathname'

def directory_has_vm_files?(path)
  Dir.glob(path.join('*.vm')).size > 0
end

unless ARGV[0]
  puts %{
    Proper usage is:

    ruby vmtranslator.rb file_directory or file.vm

    OR

    ruby vmtranslator.rb file_directory
    where file_directory has multiple vm files
  }
else
  path = Pathname.new(ARGV[0])

  if path.exist?
    if path.file?
      if File.extname(path) == '.vm'
        puts "Valid VM file"
      else
        puts "Not a VM file"
      end
    else
      if directory_has_vm_files?(path)
        puts "Valid Directory - contains vm files"
      else
        puts "#{path} does not contain any VM file"
      end
    end
  else
    puts "Invalid path"
  end
end