如何在Rebol中复制文件而不将其加载到内存中?

时间:2013-10-15 17:47:20

标签: file-io rebol

在Rebol中,有用于目录和文件管理的单词,如make-dir,what-dir,rename,create-link等。 但我找不到一个单词来简单地将文件复制到另一个位置或新创建的文件。

解决方案是READ和WRITE。例如,我可以这样做:

>> source: %.bash_history
== %.bash_history
>> target: %nothing
== %nothing
>> write/binary target (read/binary source)

效果很好。但是,如果我的文件大于可用内存呢?有没有办法复制文件而不将其加载到内存中?

目前,我对底层操作系统进行了调用:

>> call rejoin ["cp " to-string source " " to-string target]

但这不能移植到一些不同于我的平台(GNU / Linux Mint):它将在所有Unices,Mac OSX上运行,但不会在其他平台上运行。

我认为编写一个小函数来执行此操作,猜测正在运行的操作系统并相应地调整命令行应该不会太难。

所以我的问题:是否已经有一个rebol标准词来复制文件?如果没有,是否有计划在模块或其他东西中制作一个?

3 个答案:

答案 0 :(得分:4)

我不记得除了问题之外的内置方式,但你可以通过使用文件端口而不用缓冲来实现:

source: open/direct/binary/read %source
target: open/direct/binary/write %target
bytes_per: 1024 * 100
while [not none? data: copy/part source bytes_per][
   insert target data
]
close target
close source

(注意:这个答案适用于Rebol 2)

答案 1 :(得分:1)

您还可以使用系统/版本来检测脚本运行的操作系统:

call rejoin either 3 = system/version/4 [
    ;windows
    [{copy "} to-local-file source {" "} to-local-file target {"}]
] [
    ;others
    ["cp " to-string source " " to-string target]
]

同时检查此脚本http://www.rebol.org/view-script.r?script=environ.r

如果还有其他情况可以使用;

switch/default system/version/4 [
    2 [] ;mac
    3 [] ;win
         ;...
] [
         ;default
]

答案 2 :(得分:1)

还要检查一下这个问题的其他一些答案:

Carl实施了一些东西(我很惊讶它不包含在Rebol的核心中):

http://www.rebol.com/article/0281.html

帕特里克和你一样惊讶,十年和几天前:

http://www.mail-archive.com/rebol-list@rebol.com/msg16473.html