2014-10-08 4 views
0

Я пишу программу, где я просматриваю все файлы в подпапках целевой папки и делаю что-то с тем, что написано в нем. Так что моя локальная папка выглядит как то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 
+0

Возможно, это не причина вашей проблемы, но я думаю, что вы можете заменить оба вызова «Dir.foreach» одним вызовом 'Dir.glob ('*/*')' – Stefan

+0

Можете ли вы показать полный код? Ваш образец кода работает правильно на моей машине. – rohit89

+0

Спасибо за ваши ответы. Я не хочу использовать Dir.glob, поскольку мне нужно читать папку с файлами по папкам (и делать вещи в соответствии с «итоговыми результатами» файлов в одной папке, а Dir.glob, похоже, возвращает список всех файлов, соответствующих шаблон. \ nI отредактировал мой вступительный пост, чтобы показать полный код. –

ответ

0

Хорошо, я, возможно, нашли что-то, но это, кажется, некрасиво, так что если кто-то имеет лучшее решение все средства идут вперед.

Я отредактировал мой метод read_folder для разбора полного пути к read_file метода следующим образом:

def read_folder(folder) 
    Dir.foreach(folder){ |file| 
     next if File.extname(file) != ".gbk" 
     path = File.absolute_path(folder)+'/'+File.basename(file) 
     temp = read_file(path) 
     $bacteria_specs[0] += temp[0] 
     $bacteria_specs[1] += temp[1] 
    } 
    return $bacteria_specs 
end 

И я получаю путь я ожидаю. (хотя мое вызов программы C все еще не срабатывает, поэтому мне нужно будет проверить где-то в другом месте: D)