全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

ruby ftp封装实例详解

 ruby ftp封装实例详解

最近自己用ruby 封装了一个Net::FTP的工具类.

class FtpTool

 def initialize()

  @current_ftp = create_ftp

 end

 

  # 获取指定格式的文件名称列表

  # 例如: source = "test/*.txt"

  # 返回: [source/file_name.txt]

 def fetch_remote_filenames(source)

  return [] if source.blank?

  log_info("source is " + source)

  filenames = @current_ftp.nlst(source)

  filenames

 end

   # 获取服务器上确切名称的文件

  # 例如: get("test/test.txt")

  # 文件将被保存到本地 tmp/test/test.txt

 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

   # 上传文件到指定的路径

  # 例如: put("tmp\\test\\test.txt", "/test/")

def put(origin_file, remote_path)

  return nil if not File.exist?(origin_file)

  _file_name = File.basename(origin_file)

  _root = @current_ftp.getdir

  @current_ftp.chdir(remote_path)

  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

 

  # 关闭ftp

 def close

  @current_ftp.close if @current_ftp

 end

 

  # 服务器copy文件 

 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

   # 服务器上移动文件

 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

   # 重命名服务器文件

 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

 

  # 删除服务器上的文件

 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

 

 # ftp 是否关闭

 def closed?

  @current_ftp.closed?

 end

 

 class << self

    # 文件编码转换

 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

 end

 

 protected

  #生成ftp

 def create_ftp

  require "net/ftp"

  ftp = Net::FTP.new

  ftp.connect(ftp_host, ftp_port)

  ftp.login(ftp_user, ftp_pwd)

  ftp.passive = ftp_mode

  ftp

 end

 

  #本地路径

def local_file(file)

  local = File.join("tmp/", file)

  FileUtils.makedirs(File.dirname(local))

  local

 end

 

  # 删除本地文件 

 def delete_local_file(file)

  if File.exist?(file)

   log_info("delete local file : " + file)

   File.delete(file)

  end

 end

 

  # 重命名本地文件

 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

 

  #初始化参数

 def ftp_host; "x.x.x.x" end

 def ftp_port; "21" end

 def ftp_user; "x" end

 def ftp_pwd ; "x" end

 def ftp_mode; true end

end

 


# ruby  # ftp封装  # ftp封装详解  # ftp封装实现  # Ruby是什么以及如何使用  # 器上  # 重命名  # 临时文件  # 将被  # 装了  # 需要注意  # 上传文件  # 改名字  # linux  # _root  # Ftp  # window  # tmp  # rescue  # origin_file  # gsub  # local_file  # gt  # exist  # File 


相关文章: php条件判断怎么写_ifelse和switchcase的使用区别【对比】  如何用景安虚拟主机手机版绑定域名建站?  ,如何利用word制作宣传手册?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  如何选择最佳自助建站系统?快速指南解析优劣  如何快速搭建FTP站点实现文件共享?  微课制作网站有哪些,微课网怎么进?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  实惠建站价格推荐:2025年高性价比自助建站套餐解析  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  网站制作公司排行榜,抖音怎样做个人官方网站  黑客如何利用漏洞与弱口令入侵网站服务器?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  javascript基本数据类型及类型检测常用方法小结  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  建站168自助建站系统:快速模板定制与SEO优化指南  想学网站制作怎么学,建立一个网站要花费多少?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  如何在阿里云虚拟服务器快速搭建网站?  建站之星×万网:智能建站系统+自助建站平台一键生成  建站之星IIS配置教程:代码生成技巧与站点搭建指南  北京网站制作公司哪家好一点,北京租房网站有哪些?  孙琪峥织梦建站教程如何优化数据库安全?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  ppt制作免费网站有哪些,ppt模板免费下载网站?  如何通过虚拟机搭建网站?详细步骤解析  如何在新浪SAE免费搭建个人博客?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  如何快速搭建二级域名独立网站?  威客平台建站流程解析:高效搭建教程与设计优化方案  linux top下的 minerd 木马清除方法  MySQL查询结果复制到新表的方法(更新、插入)  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  建站之星如何实现网站加密操作?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  高性价比服务器租赁——企业级配置与24小时运维服务  建站之星安装步骤有哪些常见问题?  网站制作难吗安全吗,做一个网站需要多久时间?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  建站之星CMS五站合一模板配置与SEO优化指南  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  如何快速搭建支持数据库操作的智能建站平台? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。