在RCurl中创建一个C级文件句柄,用于写入下载的文件

在RCurl中创建一个C级文件句柄,用于写入下载的文件,r,curl,rcurl,R,Curl,Rcurl,在RCurl中,定义了一个函数和一个类CFILE,用于处理C级文件句柄。从手册中: 其目的是能够将这些作为选项传递给libcurl,以便它可以从文件中读取或写入文件。我们还可以使用R连接来实现这一点,并指定操纵这些连接的回调函数。但对于大型文件,使用C级文件句柄可能要快得多 没有与下载相关的示例,因此我尝试: library(RCurl) u = "http://cran.r-project.org/web/packages/RCurl/RCurl.pdf" f = CFILE("RCurl.p

在RCurl中,定义了一个函数和一个类
CFILE
,用于处理C级文件句柄。从手册中:

其目的是能够将这些作为选项传递给libcurl,以便它可以从文件中读取或写入文件。我们还可以使用R连接来实现这一点,并指定操纵这些连接的回调函数。但对于大型文件,使用C级文件句柄可能要快得多

没有与下载相关的示例,因此我尝试:

library(RCurl)
u = "http://cran.r-project.org/web/packages/RCurl/RCurl.pdf"
f = CFILE("RCurl.pdf", mode="wb")
ret= getURL(u,  write = getNativeSymbolInfo("R_curl_write_binary_data")$address,
                file  = f@ref)
我还尝试用
writedata=f@ref
。 文件已下载,但已损坏。 为
write
参数编写自定义回调仅适用于非二进制数据


有没有想过直接将二进制文件下载到RCurl中的磁盘(而不将其加载到内存中?

我想您应该使用
writedata
并记住关闭该文件

library(RCurl)
filename <- tempfile()
f <- CFILE(filename, "wb")
url <- "http://cran.fhcrc.org/Rlogo.jpg"
curlPerform(url = url, writedata = f@ref)
close(f)
有一个curl选项curl\u WRITEFUNCTION,它是一个指向带有原型的C函数的指针

size_t function(void *ptr, size_t  size, size_t nmemb, void *stream);
在R中,在执行的末尾有一个调用C函数作为“writefunction”选项的示例。所以我创建了一个文件curl\u writer.c

#include <stdio.h>

size_t
writer(void *buffer, size_t size, size_t nmemb, void *stream)
{
    fprintf(stderr, "<writer> size = %d, nmemb = %d\n",
            (int) size, (int) nmemb);
    return size * nmemb;
}
它在Linux上生成一个文件curlu writer.so,然后在R中

dyn.load("curl_writer.so")
writer <- getNativeSymbolInfo("writer", PACKAGE="curl_writer")$address
curlPerform(URL=url, writefunction=writer)
动态加载(“curl\u writer.so”)
作家我也在研究这个问题,还没有答案

然而,我确实发现:

你在Windows下工作吗?我是

此writedata函数的文档表明,在windows上,必须将writedata与writedata一起使用

在这里阅读:我发现RCurl期望writefunction是一个R函数,因此我们可以在windows上自己实现它。它将比使用C函数写入数据要慢,但是我打赌网络链接的速度将是瓶颈

getURI(url="sftp://hostname/home/me/onegeebee", curl=con, write=function(x) writeChar(x, f, eos=NULL))
Error in curlPerform(curl = curl, .opts = opts, .encoding = .encoding) : embedded nul in string: ' <`á\017_\021
getURI(url=”sftp://hostname/home/me/onegeebee,curl=con,write=function(x)writeChar(x,f,eos=NULL))

curlPerform中出错(curl=curl,.opts=opts,.encoding=.encoding):字符串中嵌入nul:'谢谢。在我写的时候,我尝试了
getURL(url=url,writedata=f@ref)
,这不起作用。因此,似乎只有
listcolloptions()
中的一部分参数可以实际传递给
getURL
。有些只被
用户接受
。我认为手册中没有提到这一点。@antonio通过查看
getURL
和RCurl源代码,默认参数
write
不适用于自定义文件,并且R\u curl\u write\u binary\u数据是在内部数据结构而不是文件句柄上操作的;提供
write
writedata
参数就足够了,我认为使用getURL就足够了。手册中的更多提示可能会有所帮助。
dyn.load("curl_writer.so")
writer <- getNativeSymbolInfo("writer", PACKAGE="curl_writer")$address
curlPerform(URL=url, writefunction=writer)
<writer> size = 1, nmemb = 2653
<writer> size = 1, nmemb = 520
OK 
#include <stdio.h>

size_t
writer(void *buffer, size_t size, size_t nmemb, void *stream)
{
    FILE *fout = (FILE *) stream;
    fprintf(fout, "<writer> size = %d, nmemb = %d\n",
            (int) size, (int) nmemb);
    fflush(fout);
    return size * nmemb;
}
dyn.load("curl_writer.so")
writer <- getNativeSymbolInfo("writer", PACKAGE="curl_writer")$address
f <- CFILE(filename <- tempfile(), "wb")
curlPerform(URL=url, writedata=f@ref, writefunction=writer)
close(f)
getURI(url="sftp://hostname/home/me/onegeebee", curl=con, write=function(x) writeChar(x, f, eos=NULL))
Error in curlPerform(curl = curl, .opts = opts, .encoding = .encoding) : embedded nul in string: ' <`á\017_\021