2

我正在尝试检查通过命令行输入的目录是否包含具有特定文件扩展名的文件。例如,如果我有一个文件夹“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

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

上面的一些代码没有完成,我只是问是否有任何方法可以检查目录中是否有某个扩展名的文件。到目前为止,我的搜索找不到任何东西。

4

3 回答 3

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
于 2012-10-18T03:36:08.387 回答
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
于 2012-10-18T03:13:20.260 回答
1
Dir["Folder1/Folder2/*.vm"].empty?

false如果 . 中有任何.vm文件,将返回Folder1/Folder2

于 2012-10-18T02:36:53.483 回答