Project1

标题: 发个复制文件的脚本 [打印本页]

作者: 洛克人SZ    时间: 2007-12-15 23:15
标题: 发个复制文件的脚本
专门用来复制文件的脚本,没有找到 RGSS 中复制文件的方法又需要用到,只好自己动手写一个了。


  1. #==============================================================================
  2. # ■ file_copy        文件复制    by 洛克人SZ
  3. #------------------------------------------------------------------------------
  4. #  用来复制文件的类。
  5. #  使用方法:file_copy("要复制的文件", "目标文件")
  6. #  效率很低,复制一个2M多的文件用了1分钟。
  7. #  主要用来复制一些小文件(存档中的截图)。
  8. #  没有找到RGSS中复制文件的方法才写的这个类,用了最简单的方法
  9. #      实现了文件复制的功能。
  10. #  不太会写说明……
  11. #==============================================================================

  12. def file_copy(filename1, filename2)
  13.   # 判断源文件是否存在
  14.   if FileTest.exist?(filename1)
  15.     # 如果目标文件存在则删之,用来避免一些讨厌的问题
  16.     File.delete(filename2) if FileTest.exist?(filename2)
  17.     # 打开源文件
  18.     ofile = File.open(filename1, "rb")
  19.     # 建立临时数据变量数组
  20.     tdata = []
  21.     # 初始化计数用变量
  22.     cou = 0
  23.     # 读取源文件 (每次读入 1 字节)
  24.     ofile.each_byte { |f|
  25.       # 计数 + 1
  26.       cou += 1
  27.       # 将读出的数据添加进临时数据数组
  28.       tdata.push(f.chr)
  29.       # 每读出一万个字节更新一下画面,避免 10s 问题
  30.       if cou == 10000
  31.         # 更新画面
  32.         Graphics.update
  33.         # 计数清零
  34.         cou = 0
  35.       end
  36.     }
  37.     # 打开目标文件
  38.     nfile = File.open(filename2, "wb")
  39.     # 初始化计数用变量
  40.     cou = 0
  41.     # 循环
  42.     for i in 0...tdata.size
  43.       # 计数 + 1
  44.       cou += 1
  45.       # 将临时数据数组中的数据写入目标文件
  46.       nfile.write(tdata[i])
  47.       # 每写入一万个字节更新一下画面,避免 10s 问题
  48.       if cou == 10000
  49.         # 更新画面
  50.         Graphics.update
  51.         # 计数清零
  52.         cou = 0
  53.       end
  54.     end
  55.     # 清除临时变量数据
  56.     tdata = nil
  57.     # 关闭源文件与目标文件
  58.     ofile.close
  59.     nfile.close
  60.     # 返回结果
  61.     return "复制完成!"
  62.   # 源文件不存在的情况下
  63.   else
  64.     # 返回结果
  65.     return "源文件未找到!"
  66.   end
  67. end
复制代码


[LINE]1,#dddddd[/LINE]
以下为66提供教程
test = Win32API.new('kernel32', 'CopyFileA',%(p p l), 'l')
p test.call("game.ini", "faint.ini", 0)
使用:
xxxx = Win32API.new('kernel32', 'CopyFileA',%(p p l), 'l')
xxx = xxxx.call("原文件(相对)", "目标(相对)", 0)
p xxx
作者: 洛克人SZ    时间: 2007-12-15 23:15
标题: 发个复制文件的脚本
专门用来复制文件的脚本,没有找到 RGSS 中复制文件的方法又需要用到,只好自己动手写一个了。


  1. #==============================================================================
  2. # ■ file_copy        文件复制    by 洛克人SZ
  3. #------------------------------------------------------------------------------
  4. #  用来复制文件的类。
  5. #  使用方法:file_copy("要复制的文件", "目标文件")
  6. #  效率很低,复制一个2M多的文件用了1分钟。
  7. #  主要用来复制一些小文件(存档中的截图)。
  8. #  没有找到RGSS中复制文件的方法才写的这个类,用了最简单的方法
  9. #      实现了文件复制的功能。
  10. #  不太会写说明……
  11. #==============================================================================

  12. def file_copy(filename1, filename2)
  13.   # 判断源文件是否存在
  14.   if FileTest.exist?(filename1)
  15.     # 如果目标文件存在则删之,用来避免一些讨厌的问题
  16.     File.delete(filename2) if FileTest.exist?(filename2)
  17.     # 打开源文件
  18.     ofile = File.open(filename1, "rb")
  19.     # 建立临时数据变量数组
  20.     tdata = []
  21.     # 初始化计数用变量
  22.     cou = 0
  23.     # 读取源文件 (每次读入 1 字节)
  24.     ofile.each_byte { |f|
  25.       # 计数 + 1
  26.       cou += 1
  27.       # 将读出的数据添加进临时数据数组
  28.       tdata.push(f.chr)
  29.       # 每读出一万个字节更新一下画面,避免 10s 问题
  30.       if cou == 10000
  31.         # 更新画面
  32.         Graphics.update
  33.         # 计数清零
  34.         cou = 0
  35.       end
  36.     }
  37.     # 打开目标文件
  38.     nfile = File.open(filename2, "wb")
  39.     # 初始化计数用变量
  40.     cou = 0
  41.     # 循环
  42.     for i in 0...tdata.size
  43.       # 计数 + 1
  44.       cou += 1
  45.       # 将临时数据数组中的数据写入目标文件
  46.       nfile.write(tdata[i])
  47.       # 每写入一万个字节更新一下画面,避免 10s 问题
  48.       if cou == 10000
  49.         # 更新画面
  50.         Graphics.update
  51.         # 计数清零
  52.         cou = 0
  53.       end
  54.     end
  55.     # 清除临时变量数据
  56.     tdata = nil
  57.     # 关闭源文件与目标文件
  58.     ofile.close
  59.     nfile.close
  60.     # 返回结果
  61.     return "复制完成!"
  62.   # 源文件不存在的情况下
  63.   else
  64.     # 返回结果
  65.     return "源文件未找到!"
  66.   end
  67. end
复制代码


[LINE]1,#dddddd[/LINE]
以下为66提供教程
test = Win32API.new('kernel32', 'CopyFileA',%(p p l), 'l')
p test.call("game.ini", "faint.ini", 0)
使用:
xxxx = Win32API.new('kernel32', 'CopyFileA',%(p p l), 'l')
xxx = xxxx.call("原文件(相对)", "目标(相对)", 0)
p xxx
作者: yangff    时间: 2007-12-15 23:18
-_-bbb
作者: Eclair    时间: 2007-12-16 01:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: yangff    时间: 2007-12-16 01:42
do loop
读一个字节
记录
村一个字节
end
作者: 洛克人SZ    时间: 2007-12-16 02:39
以下引用yangff于2007-12-15 17:42:21的发言:

do loop
读一个字节
记录
村一个字节
end


用这个方法会不断读写,复制时不太安全。还是先全部读到内存中更好,毕竟只是用来复制小文件的。

以下引用Eclair于2007-12-15 17:27:05的发言:

用了一些专业知识...偶不明白了。


其实也没用什么专业知识,就是用 .each_byte 方法加 .chr 方法将文件中的每个字节读出来并转换为字符,再用 .write 方法写入新文件,原理其实很简单……

另外,这个脚本稍加修改后可以直接生成文件……
作者: yangff    时间: 2007-12-16 02:43
以下为66提供教程
test = Win32API.new('kernel32', 'CopyFileA',%(p p l), 'l')
p test.call("game.ini", "faint.ini", 0)
使用:
xxxx = Win32API.new('kernel32', 'CopyFileA',%(p p l), 'l')
xxx = xxxx.call("原文件(相对)", "目标(相对)", 0)
p xxx

作者: 洛克人SZ    时间: 2007-12-16 02:53
以下引用yangff于2007-12-15 18:43:41的发言:

以下为66提供教程
test = Win32API.new('kernel32', 'CopyFileA',%(p p l), 'l')
p test.call("game.ini", "faint.ini", 0)
使用:
xxxx = Win32API.new('kernel32', 'CopyFileA',%(p p l), 'l')
xxx = xxxx.call("原文件(相对)", "目标(相对)", 0)
p xxx


{/ll}早知道有这个方法就好了。
作者: Eclair    时间: 2007-12-16 05:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: Eclair    时间: 2008-1-26 05:37
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1