gpt4 book ai didi

ruby ftp封装实例详解

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章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 。

最后此篇关于ruby ftp封装实例详解的文章就讲到这里了,如果你想了解更多关于ruby ftp封装实例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com