这个Errno :: ENOENT错误来自哪里?

时间:2014-09-01 03:44:47

标签: ruby

初学者,自学Ruby。我得到了Errno :: ENOENT,我想我知道怎么做,但我不明白为什么我会得到它。这是错误:

Downloading 4 files:  .  .  . c11-photos.rb:29:in `rename': No such file or 
directory - (c:/users/7/dropbox/3-coding/ruby/study/blizz-01.jpg, blitz-03.jpg)
(Errno::ENOENT)
    from c11-photos.rb:29:in `block in <main>'
    from c11-photos.rb:20:in `each'
    from c11-photos.rb:20:in `<main>'

首先,该计划有效。准确移动和重命名所有文件。但是这个错误在它运行完毕后弹出。对于这个特定的工作,只有2张图片被移动到一个新目录,但请注意该程序说它下载了4个文件。似乎正在发生的事情是我的#each方法在执行时以某种方式重复。即使目标目录没有更多要移动的图片文件,它也会尝试继续移动文件。我猜这是因为&#34; blizz-01.jpg&#34; file是要移动的文件之一,但是&#34; blitz-03.jpg&#34;不是任何文件的名称(如果要移动第三张图片,这是可能的名称)。因为&#34; blizz-01.jpg&#34;已经被移动了,这会让它给我一个&#34;没有这样的文件......&#34;错误。当然,我不知道这是不是发生了什么,但这似乎是错误所说的。

为什么我收到此错误和/或我的代码出现了什么问题?它会产生此问题?

这是我的代码:

require "yaml"

puts "Where to move the pictures?"
destination = gets.chomp

Dir.chdir "#{destination}"

puts "What shall we name this batch?"
batch = gets.chomp

puts "Where to get your new pictures?"
findpics = gets.chomp

pictures = Dir["#{findpics}/*.{jpg,JPG,JPEG,jpeg,png,PNG}"]

print "Downloading #{pictures.length} files: "

amount = 1

pictures.each do |pic|
print ' . '

newname = if amount < 10
    "#{batch}-0#{amount}.jpg"
else
    "#{batch}-#{amount}.jpg"
end

File.rename pic, newname
amount += 1
end

puts

puts "Operation complete!"

谢谢你的帮助!

1 个答案:

答案 0 :(得分:3)

不区分大小写的文件系统?

blizz-01.jpg匹配两次,一次由"#{findpics}/*.jpg"匹配,一次由"#{findpics}/*.JPG"匹配,这两个是Dir[]的文件系统glob参数的两个扩展。其他文件的注释相同。显然,第二次在each循环中处理它时,它已经被重命名。

如果您希望这在区分大小写和不区分大小写的文件系统上都有效,并且允许“.jpg”和“.JPG”等等,那么您可以快速而简单地使用匹配项:

pictures = Dir["#{findpics}/*.{jpg,JPG,JPEG,jpeg,png,PNG}"].uniq