3

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

一个解决方案是读写。例如,我可以这样做:

>> 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 标准词来复制文件?如果没有,是否有计划在模块或其他东西中制作一个?

4

3 回答 3

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)

于 2013-10-15T18:21:03.887 回答
1

Also check there, a few other answers for this problem:

Carl implemented something (I'm surprised it is not included in the heart of Rebol):

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

And Patrick was as surprised as you, a decade and some days ago:

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

于 2013-10-16T10:11:21.193 回答
1

您还可以使用 system/version 来检测您的脚本在哪个操作系统上运行:

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
]
于 2013-10-16T09:54:12.710 回答