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