Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 在cURL中请求文件列表SFTP时显示完整日期_Date_Curl_Sftp - Fatal编程技术网

Date 在cURL中请求文件列表SFTP时显示完整日期

Date 在cURL中请求文件列表SFTP时显示完整日期,date,curl,sftp,Date,Curl,Sftp,我将cURL与STFP服务器一起使用,并尝试为下面的过程获取正确的日期格式 此时,当我询问文件列表时,我得到以下信息: -rw-r--r-- 1 0 0 718541 Dec 24 18:25 myfile.png 问题是,我还需要获取年份,但只有当文件的时间超过一年时,年份才可用,在本例中,将hour:minute替换为年份 -rw-r--r-- 1 0 0 718541 Dec 24 2000 myoldfil

我将cURL与STFP服务器一起使用,并尝试为下面的过程获取正确的日期格式

此时,当我询问文件列表时,我得到以下信息:

-rw-r--r--    1 0        0          718541 Dec 24  18:25 myfile.png
问题是,我还需要获取年份,但只有当文件的时间超过一年时,年份才可用,在本例中,将hour:minute替换为年份

-rw-r--r--    1 0        0          718541 Dec 24  2000 myoldfile.png
在FTP中有一个参数“MLSD”,它可以格式化显示完整日期的日期,但我没有找到SFTP的等效值

考虑到结果看起来像是一个
ls-la
unix命令,我尝试使用
ls-la--full-time
,但这个参数在SFTP服务器上似乎不起作用

有没有办法检索包含日期的文件列表:年-月-日-小时-分钟


无论是什么格式?

看起来您无法使用SFTP协议使curl生成完整的时间戳

但这是curl的一个限制,而不是SFTP协议或服务器本身

SFTP服务器为每个文件提供完整的时间戳(和其他属性)。此外,它还提供文件的文本“描述”。curl打印该描述(并丢弃完整的时间戳和其他属性)。OpenSSH SFTP服务器以您看到的格式生成“描述”。因此,您看到的行为是OpenSSH SFTP服务器和curl的组合


使用另一个可以利用服务器提供的完整时间戳的SFTP客户端或SFTP库(Python、PHP等)将有所帮助。

我使用curl选项解决了我的问题
CURLOPT\u FILETIME

通过提供所需文件的名称,它将检索可在
时间上强制转换的

下面是它的工作原理示例(可以在curl示例代码中找到):

设置连接

curl_easy_setopt(mHandleCurl, CURLOPT_URL, "sftp://192.168.1.10/myfile.txt");
curl_easy_setopt(mHandleCurl, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);   
curl_easy_setopt(mHandleCurl, CURLOPT_PORT, 22);
curl_easy_setopt(mHandleCurl, CURLOPT_USERNAME, sUsername);
curl_easy_setopt(mHandleCurl, CURLOPT_PASSWORD, sPassword);
设置空回调-看起来是必需的

curl_easy_setopt(mHandleCurl, CURLOPT_WRITEFUNCTION, throw_away);
curl_easy_setopt(mHandleCurl, CURLOPT_FILETIME, 1L);

curl_easy_perform(mHandleCurl); // Perform
回拨代码:

static size_t throw_away(void *ptr, size_t size, size_t nmemb, void *data)
{
   (void)ptr;
   (void)data;
   /* we are not interested in the headers itself,
      so we only return the size we would have saved ... */
   return (size_t)(size * nmemb);
}
然后获取文件的时间戳

long lTimestamp = -1;
curl_easy_getinfo(mHandleCurl, CURLINFO_FILETIME, &lTimestamp);
并将其强制转换为time_t或struct tm以获得完整的时间戳访问

time_t t_filetimestamp = (time_t) lTimestamp;

struct tm* tm_filetimestamp;
tm_filetimestamp = localtime(&t_filetimestamp);

可以,但它不允许您从目录列表中检索时间戳。你必须分别为每个文件调用它。