class Struggle::FtpTool

Public Class Methods

convert(src_file, dest_file, from_encode, to_encode) click to toggle source

文件编码转换

# File lib/struggle/ftp_tool.rb, line 129
def convert(src_file, dest_file, from_encode, to_encode)
  log_info("Convert #{src_file} to #{dest_file}")
  cd = Iconv.new(to_encode, from_encode)
  File.open(dest_file, "w") do |out|
    File.open(src_file) do |in_stream|
      in_stream.each_line do |line|
        begin
          new_line = cd.iconv(line)
          out.write(new_line)
        rescue => e
          log_info "convert line error : #{line}"
          next
        end
      end
    end
  end
  cd.close
  dest_file
end
new(host, user, password, port = 21, mode = true) click to toggle source

实例化

# File lib/struggle/ftp_tool.rb, line 4
def initialize(host, user, password, port = 21, mode = true)
  require "net/ftp"
  @current_ftp = Net::FTP.new
  @current_ftp.connect(host, port)
  @current_ftp.login(user, password)
  @current_ftp.passive = mode
end

Public Instance Methods

close() click to toggle source

关闭ftp

# File lib/struggle/ftp_tool.rb, line 61
def close
  @current_ftp.close if @current_ftp
end
closed?() click to toggle source

ftp 是否关闭

# File lib/struggle/ftp_tool.rb, line 123
def closed?
  @current_ftp.closed?
end
copy(origin_file, file_path) click to toggle source

服务器copy文件

# File lib/struggle/ftp_tool.rb, line 66
def copy(origin_file, file_path)
  local_file = local_file(origin_file)
  _file_name = File.basename(origin_file)
  begin
    #1. 到本地
    log_info("FTP get file to:" + local_file+".tmp")
    @current_ftp.getbinaryfile(origin_file, local_file+".tmp")
    return nil if not File.exist?(local_file+".tmp")
    #2. 到服务器
    log_info("FTP put file to :" + file_path + _file_name + ".tmp")
    @current_ftp.putbinaryfile(local_file+".tmp", file_path + _file_name + ".tmp")
    #3. 改名字
    rename(file_path + _file_name + ".tmp", file_path + _file_name)
    #5. 删除本地
    delete_local_file(local_file + ".tmp")
  rescue => e
    log_info(e)
    #4. 删除服务器上临时文件
    delete(file_path + origin_file + ".tmp")
    #5. 删除本地
    delete_local_file(local_file + ".tmp")
  end
end
delete(origin_file) click to toggle source

删除服务器上的文件

# File lib/struggle/ftp_tool.rb, line 115
def delete(origin_file)
  if not @current_ftp.list(origin_file).blank?
    log_info("FTP delete #{origin_file}")
    @current_ftp.delete(origin_file)
  end
end
fetch_remote_filenames(source) click to toggle source

获取指定格式的文件名称列表 例如: source = “test/*.txt” 返回: [source/file_name.txt]

# File lib/struggle/ftp_tool.rb, line 15
def fetch_remote_filenames(source)
  return [] if source.blank?
  log_info("source is " + source)
  filenames = @current_ftp.nlst(source)
  filenames
end
get(origin_file) click to toggle source

获取服务器上确切名称的文件 例如: get(“test/test.txt”) 文件将被保存到本地 tmp/test/test.txt

# File lib/struggle/ftp_tool.rb, line 25
def get(origin_file)
  local_file = local_file(origin_file)
  local_file.gsub("\\", "\\\\") #此处注意是window下执行, 在linux下需要注意改成/
  log_info("Ftp Get: #{origin_file} -> #{local_file}")
  begin
    @current_ftp.getbinaryfile(origin_file, local_file+".tmp")
  rescue
    delete_local_file(local_file+".tmp")
  end
  rename_local_file(local_file+".tmp", local_file) if File.exist?(local_file+".tmp")
end
move(origin_file, file_path) click to toggle source

服务器上移动文件

# File lib/struggle/ftp_tool.rb, line 91
def move(origin_file, file_path)
  _file_name = File.basename(origin_file)
  begin
    copy(origin_file, file_path)
    # 删除服务器上源文件
    delete(origin_file)
  rescue => e
    log_info(e)
    # 删除临时文件,如果存在
    delete(file_path + _file_name + ".tmp")
    # 删除服务器上目标文件, 如果存在
    delete(file_path + _file_name)
  end
end
put(origin_file, remote_path) click to toggle source

上传文件到指定的路径 例如: put(“tmp\test\test.txt”, “/test/”)

# File lib/struggle/ftp_tool.rb, line 40
def put(origin_file, remote_path)
  return nil if not File.exist?(origin_file)
  _file_name = File.basename(origin_file)
  _root = @current_ftp.getdir
  begin
    @current_ftp.chdir(remote_path)
  rescue
    @current_ftp.mkdir(remote_path)
    @current_ftp.chdir(remote_path)
  end
  log_info("Ftp put: #{origin_file} -> #{remote_path}")
  begin
    @current_ftp.putbinaryfile(origin_file, remote_path + _file_name + ".tmp")
  rescue
    delete(remote_path + _file_name + ".tmp")
  end
  @current_ftp.chdir(_root)
  rename(remote_path + _file_name + ".tmp", remote_path + _file_name)
end
rename(origin_file, file) click to toggle source

重命名服务器文件

# File lib/struggle/ftp_tool.rb, line 107
def rename(origin_file, file)
  if not @current_ftp.list(origin_file).blank?
    log_info("FTP rename #{origin_file} to #{file}")
    @current_ftp.rename(origin_file, file)
  end
end

Protected Instance Methods

delete_local_file(file) click to toggle source

删除本地文件

# File lib/struggle/ftp_tool.rb, line 160
def delete_local_file(file)
  if File.exist?(file)
    log_info("delete local file : " + file)
    File.delete(file)
  end
end
local_file(file) click to toggle source

本地路径

# File lib/struggle/ftp_tool.rb, line 153
def local_file(file)
  local = File.join("tmp/", file)
  FileUtils.makedirs(File.dirname(local))
  local
end
rename_local_file(origin_file, file) click to toggle source

重命名本地文件

# File lib/struggle/ftp_tool.rb, line 168
def rename_local_file(origin_file, file)
  if File.exist?(origin_file)
    log_info("rename local file : " + origin_file + " to " + file)
    File.rename(origin_file, file)
  end
end

Private Instance Methods

log_info(log) click to toggle source
# File lib/struggle/ftp_tool.rb, line 176
def log_info(log)
  if Rails.env == "development"
    puts log
  end
end