MST
星途 面试题库

面试题:Ruby复杂文件读写与目录操作的综合应用

假设有一个复杂的目录结构,其中包含多种类型的文件。要求使用Ruby编写一个工具,能够根据用户输入的文件类型(如.txt、.jpg等),将该类型的所有文件从源目录移动到一个新创建的目标目录中,同时在移动过程中,对文本文件(.txt)进行加密处理(简单的凯撒密码,偏移量为3),并且记录下移动的文件路径和操作时间到一个日志文件中。请详细阐述你的实现思路并给出核心代码。
35.3万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 获取用户输入的文件类型:通过命令行参数或者交互式输入获取用户想要移动的文件类型。
  2. 创建目标目录:如果目标目录不存在,则创建它。
  3. 遍历源目录:递归地遍历源目录及其子目录,找到所有指定类型的文件。
  4. 移动文件:将找到的文件移动到目标目录。
  5. 加密文本文件:对于.txt文件,在移动前使用凯撒密码进行加密。
  6. 记录日志:记录每个移动文件的路径和操作时间到日志文件。

核心代码

require 'fileutils'
require 'time'

# 获取用户输入的文件类型
puts "请输入文件类型(如.txt、.jpg):"
file_type = gets.chomp

# 源目录和目标目录
source_dir = '.'
target_dir = "target_#{file_type}"

# 创建目标目录
FileUtils.mkdir_p(target_dir) unless Dir.exist?(target_dir)

# 日志文件路径
log_file = 'file_move_log.txt'

# 凯撒密码加密函数
def caesar_cipher(text, shift)
  result = ''
  text.each_char do |char|
    if char.match(/[a-zA-Z]/)
      if char.match(/[a-z]/)
        result << ((char.ord - 97 + shift) % 26 + 97).chr
      else
        result << ((char.ord - 65 + shift) % 26 + 65).chr
      end
    else
      result << char
    end
  end
  result
end

# 遍历源目录
Dir.glob("#{source_dir}/**/*#{file_type}") do |file|
  new_file_path = File.join(target_dir, File.basename(file))
  if file_type == '.txt'
    content = File.read(file)
    encrypted_content = caesar_cipher(content, 3)
    File.write(new_file_path, encrypted_content)
  else
    FileUtils.mv(file, new_file_path)
  end
  # 记录日志
  log_entry = "#{Time.now}: #{file} -> #{new_file_path}\n"
  File.open(log_file, 'a') { |f| f.write(log_entry) }
end