2013-04-11 43 views
2

下面是假定读取目录的一段代码,并且每个文件条目都打印该文件的第一行。问题是x不可见,所以文件没有被解析。在Ruby-分析目录中并读取文件的第一行

Dir.foreach("C:/fileload/src") do |file_name| 
    x = file_name 
    puts x 
    f = File.open("C:/fileload/src/" +x) 
    f.readlines[1..1].each do |line| 
    puts line 
    end 
end 

回答

2

你为什么分配xfile_name?您可以直接使用file_name。如果您只是阅读文件的第一行,为什么不尝试呢?

#!/usr/bin/ruby 

dir = "C:/fileload/src" 
Dir.foreach(dir) do |file_name| 
    full = File.join(dir, file_name) 
    if File.file?(full) 
     f = File.open(full) 
     puts f.first 
     f.close 
    end 
end 

您应该使用File.join在Ruby中安全地组合路径。我还检查了你正在使用File.file?方法打开一个文件。

+0

谢谢。欣赏你的答案。这正是我想要完成的。感谢您深入了解f.first和File.join – nprs

+0

@nprs很高兴能为您提供帮助。干杯。 – squiguy

2

您有无可见性问题x。您应该使用File::joinPathname#+来构建文件路径。您应该排除非文件的考虑。您正在选择第二行,而不是第一行[1..1]。这里有一个更清洁的正确替代你的示例代码。

dir = "C:/fileload/src" 
Dir.foreach(dir). 
map { |fn| File.join(dir,fn) }. 
select { |fn| File.file?(fn) }. 
each { |fn| puts File.readlines(fn).first } 
+0

这是一个非常有趣的方法,它让我想了一会儿。 – squiguy

+0

@squiguy这个想法并不是让你思考,而是要说清楚你想要的。一旦你习惯于以更具功能的方式思考/阅读,这就像一个配方:1)产生目录列表,2)将地图映射到路径,3)选择那些文件,4)打印第一行每个文件。 – dbenhur

+0

我不反对功能风格,我只是欣赏它:)。 – squiguy