File io 在Rebol中,如何在不将文件加载到内存的情况下复制文件?

File io 在Rebol中,如何在不将文件加载到内存的情况下复制文件?,file-io,rebol,File Io,Rebol,在Rebol中,有用于目录和文件管理的单词,如make dir、what dir、rename、create link等。 但我找不到一个词来简单地将文件复制到另一个位置或新创建的文件 解决方法是读写。例如,我可以做: >> source: %.bash_history == %.bash_history >> target: %nothing == %nothing >> write/binary target (read/binary source) 而

在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/LinuxMint):它将在所有Unice、MacOSX上运行,但不能在其他平台上运行

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


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

除了问题之外,我不记得有内置的方法,但您可以通过使用文件端口而不使用缓冲:

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)

您还可以使用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]
]
请检查此脚本

如果有其他情况可以使用

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

另外,请查看此问题的其他一些答案:

Carl实现了一些东西(我很惊讶它没有包含在Rebol的核心部分):

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


回答得好,建议的代码运行得非常好。但是请注意,这使用了非标准的编码样式(
bytes\u per
),这违反了单词命名的规则。在公共Rebol代码中,我强烈建议遵守已发布的编码惯例,并使用
字节/code>。@earl说编码风格不强制执行;他们只是向导。我根据变量的使用方式选择破折号和下划线。像您这样的编辑,是不受欢迎的。感谢指向meta的指针,看来评论是评论编码风格违规的最佳场所。显然,这些Rebol命名约定并没有被强制执行(否则我们就不必进行此对话),但这并不会使它们变得不那么有用。将“样式”和“违反”放在同一句话中会暴露评论者。我们从来没有进行过这样的“对话”,而是为了他的首创。我总是用小写、下划线分隔的方式命名变量(单词),比如bytes_per。我只是觉得它更可读,更方便,等等。用连字符分隔不适合我最喜欢的编辑器的自动补全,除非我手动切换rebol的语法。无论如何,我不认为遵守公约有那么重要,严格来说,这不是一种违反。但从现在起,我将尝试根据这个规则命名变量(单词)。