• 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

  • 相关阅读:
    【学习笔记】Half-GCD
    设计模式(5)--模板方法模式概念要点及例子说明
    时候在你的职业技能中增加隐私知识了,那今天就说下CDPSE吧
    【算法集训专题攻克篇】第十三篇之双向链表(较难)
    VSCode(Visual Studio Code)扩展及缓存占用C盘空间问题的解决
    不可不知的USB2.0/USB3.0/HDMI静电防护方案
    数据中心标签的重要性
    “百模大战”大模型哪家强?开源的全面评测来了!
    线段树合并
    归并排序(MergeSort)
  • 原文地址:https://blog.csdn.net/jh035512/article/details/128060225