Я пишу программу, где я просматриваю все файлы в подпапках целевой папки и делаю что-то с тем, что написано в нем. Так что моя локальная папка выглядит как тоRuby file полный путь
Folder
--Subfolder
---File
---File
---File
--Subfolder
---File
.
.
.
Так что у меня каждый цикл в цикле через все вложенные папки и для каждой вложенной я звоню метод, который в основном делает то же самое, но в папке и вызовите для каждого файла другого метод (разбор его аргумента файла, который я получил с помощью команды Dir.foreach(folder){ |file| method(file)}
).
Так это выглядит следующим образом:
Dir.foreach(Dir.pwd){ |folder| call_method(folder) }
def call_method(folder) Dir.foreach(folder){|file| reading_method(file) } end
Этого последний так называемый метод (reading_method) должен открыть называемый метод C и разобрать в качестве аргумента полного пути к файлу (так, что программа C может открыть его), поэтому я использую File.absolute_path(file)
в read_method, но вместо того, чтобы возвращать C:/folder/subfolder/file
, как я хочу, он возвращает C:/folder/file
, пропуская подпапку (и, следовательно, программа C не может выполнить).
Есть ли способ получить полный путь к этому файлу?
Спасибо за вашу помощь
EDIT: Вот полный код, как спросил
## Module
module GBK_Reader
PATH = "Z:/Folder/"
SAFETY = true
SAFETY_COUNT = 10
end
## Methods definitions
def read_file(file)
path = File.absolute_path(file)
c_string = `C:/Code/GBK_Reader/bin/Debug/GBK_Reader.exe #{path}`
return c_string.split(/ /).collect!{|spec| spec.to_i}
end
def read_folder(folder)
Dir.foreach(folder){ |file|
next if File.extname(file) != ".gbk"
temp = read_file(file)
#$bacteria_specs[0] += temp[0]
#$bacteria_specs[1] += temp[1]
}
return $bacteria_specs
end
## Main
# Look for folder
Dir.chdir(GBK_Reader::PATH)
puts "Directory found"
# Cycle through all sub-folders
$high_gc = {} #Hash to store high GC content bacterias
$count = 0
puts "Array variable set"
Dir.foreach(Dir.pwd){ |file|
next if file == "." || file == ".."
break if $count >= GBK_Reader::SAFETY_COUNT
$count += 1 if GBK_Reader::SAFETY
$bacteria_specs = [0.00, 0.00, 0.00]
$path = File.expand_path(file)
if File.directory?(file)
# Cycle through all .gbk files in sub-folder and call C program
read_folder(file)
else
# Call C program to directly evaluate GC content
c_string = read_file(file) if File.extname(file) == ".gbk"
$bacteria_specs[0] = c_string[0].to_i
$bacteria_specs[1] = c_string[1].to_i
end
# Evaluate GC content and store suitable entries
$bacteria_specs[2] = ($bacteria_specs[0]/$bacteria_specs[1])*100.00
$high_gc[file] = $bacteria_specs if $bacteria_specs[2] > 60
}
# Display suitable entries
puts "\n\n\n"
puts $high_gc
gets.chomp
Возможно, это не причина вашей проблемы, но я думаю, что вы можете заменить оба вызова «Dir.foreach» одним вызовом 'Dir.glob ('*/*')' – Stefan
Можете ли вы показать полный код? Ваш образец кода работает правильно на моей машине. – rohit89
Спасибо за ваши ответы. Я не хочу использовать Dir.glob, поскольку мне нужно читать папку с файлами по папкам (и делать вещи в соответствии с «итоговыми результатами» файлов в одной папке, а Dir.glob, похоже, возвращает список всех файлов, соответствующих шаблон. \ nI отредактировал мой вступительный пост, чтобы показать полный код. –