脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Ruby - ruby ftp封装实例详解

ruby ftp封装实例详解

2020-05-12 10:32迅800 Ruby

这篇文章主要介绍了ruby ftp封装实例详解的相关资料,需要的朋友可以参考下

 ruby ftp封装实例详解

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

?
1
2
3
4
5
6
7
8
9
class FtpTool
 
 def initialize()
 
  @current_ftp = create_ftp
 
 end

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

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

  # 返回: [source/file_name.txt]

?
1
2
3
4
5
6
7
8
9
10
11
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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/")

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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

?
1
2
3
4
5
6
7
def close
 
 @current_ftp.close if @current_ftp
 
end

  # 服务器copy文件 

?
1
2
3
4
5
6
7
def copy(origin_file, file_path)
 
 local_file = local_file(origin_file)
 
 _file_name = File.basename(origin_file)
 
 begin

      #1. 到本地    

?
1
2
3
4
5
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. 到服务器   

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

   # 服务器上移动文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

   # 重命名服务器文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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

  # 删除服务器上的文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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 是否关闭

?
1
2
3
4
5
6
7
8
9
def closed?
 
 @current_ftp.closed?
 
end
 
 
 
class << self

    # 文件编码转换

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

  #本地路径

?
1
2
3
4
5
6
7
8
9
10
11
def local_file(file)
 
  local = File.join("tmp/", file)
 
  FileUtils.makedirs(File.dirname(local))
 
  local
 
 end

  # 删除本地文件 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
def delete_local_file(file)
 
 if File.exist?(file)
 
  log_info("delete local file : " + file)
 
  File.delete(file)
 
 end
 
end

  # 重命名本地文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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

  #初始化参数

?
1
2
3
4
5
6
7
8
9
10
11
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

原文链接:http://blog.csdn.net/sean_cd/article/details/7307307

延伸 · 阅读

精彩推荐
  • RubyRuby环境下安装使用bundler来管理多版本的gem

    Ruby环境下安装使用bundler来管理多版本的gem

    这篇文章主要介绍了Ruby环境下安装使用bundler来管理多版本的gem的方法,举了Ruby On Rails中的应用实例来进行演示,需要的朋友可以参考下 ...

    日拱一卒4332020-05-10
  • RubyRuby简洁学习笔记(一):字符串、数字、类和对象

    Ruby简洁学习笔记(一):字符串、数字、类和对象

    这篇文章主要介绍了Ruby简洁学习笔记(一):字符串、数字、类和对象,本文是学习笔记第一篇,需要的朋友可以参考下 ...

    脚本之家2472020-04-20
  • Ruby简要说明Ruby中的迭代器

    简要说明Ruby中的迭代器

    这篇文章主要介绍了Ruby中的迭代器,迭代器的概念在动态语言的编程中十分重要,文章中介绍了Ruby中的each迭代器和collect迭代器,需要的朋友可以参考下 ...

    goldensun2772020-04-25
  • RubyRuby进行文件信息输出实例代码

    Ruby进行文件信息输出实例代码

    Ruby进行文件信息输出实例代码,数据是随机的,所以每次的记录都会不同。 ...

    ruby教程网2962020-04-10
  • RubyCentOS中配置Ruby on Rails环境

    CentOS中配置Ruby on Rails环境

    经过一个上午的折腾,终于把ROR环境在CentOS中搞定,绕了很多弯路,把文章写下来总结一下 ...

    可乐加糖4762020-04-12
  • RubyRuby设计模式编程中使用Builder建造者模式的实例

    Ruby设计模式编程中使用Builder建造者模式的实例

    这篇文章主要介绍了Ruby设计模式编程中使用Builder建造者模式的实例,建造者模式将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表...

    范孝鹏2192020-05-07
  • RubyRuby迭代器的7种技巧分享

    Ruby迭代器的7种技巧分享

    这篇文章主要介绍了Ruby迭代器的7种技巧分享,Ruby中的迭代器非常人性化,本文既是讲解了7个技巧也是讲解了7种迭代器,需要的朋友可以参考下 ...

    脚本之家4782020-04-20
  • Ruby剖析 Ruby 访问控制

    剖析 Ruby 访问控制

    前面,我们说 Ruby 没有函数,只有方法.而且实际上有不止一种方法.这一节我们介绍 访问控制 (accesscontrols). 想想当我们在最高层而不是在一个类的定义里定义...

    ruby教程网3572020-04-08