获取IPFS目录数

  • 本文关键字:IPFS 获取 api go ipfs
  • 更新时间 :
  • 英文 :


我在WSL Ubuntu 18.04上安装了ipfs version 0.8.0。使用sudo ipfs daemon启动ipfs。使用sudo ipfs add -r /home/user/ipfstest命令添加了2个目录,结果如下:

添加QmfYH2KVxANPA3um1W5MYWA6zR4Awv8VscaWyhhQBVj65L ipfstest/abc.sh添加QmTXny9ZjuFPm4C4KbQSEYxvUp2MYbSCLppPQirW7ap4Go ipfstest

同样地,我又添加了一个包含2个文件的目录。现在,我需要使用go-ipfs-api获取ipfs中的所有文件和目录。下面是我的代码:

package main
import (
"fmt"
"context"
"os"
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/ipfs/go-ipfs-api"
)
var sh *shell.Shell
func main() {
sh := shell.NewShell("localhost:5001")
dir,err:=sh.FilesLs(context.TODO(),"")
if err != nil {
fmt.Fprintf(os.Stderr, "error: %s", err)
os.Exit(1)
}
fmt.Printf("Dir are: %d", dir)
pins,err:=sh.Pins()
if err != nil {
fmt.Fprintf(os.Stderr, "error: %s", err)
os.Exit(1)
}
fmt.Printf("Pins are: %d", len(pins))
dqfs_pincount.Add(float64(len(pins)))
prometheus.MustRegister(dqfs_pincount)
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":8090", nil)
}

如果我运行这段代码,我得到的输出如下:

Dir are: [824634392256] Pins are: 18

固定文件随着我添加文件而增加。但是输出[824634392256]是什么呢?为什么只有一个?

我试着给函数dir,err:=sh.FilesLs(context.TODO(),"/.ipfs")一个路径。因为我猜文件和目录必须存储在~/.ipfs。但是这会给出一个错误:

error: files/ls: file does not exist

如何获取ipfs的所有目录?我错在哪里?我应该证明哪条路径作为参数?请大家多多指教。

这里有一点需要解开。

为什么使用sudo?

IPFS意味着作为普通用户运行。通常您不希望以root身份运行它,但是您可以运行相同的命令,只是没有sudo:

ipfs daemon
ipfs add -r /home/user/ipfstest
...

代码无法编译

让我们从代码开始,在继续之前确保它按预期工作,首先是导入:

"github.com/ipfs/go-ipfs-api"

应该读:

shell "github.com/ipfs/go-ipfs-api"

否则代码将无法编译,因为您稍后在代码中使用了shell

为什么dir产生它所做的输出?

接下来,让我们看看dir的使用情况。您存储的是*[]MfsLsEntry(MfsLsEntry),它是一个指针切片。您将使用字符串格式%d输出它,这将是一个base10整数(docs),因此"824634392256"是MfsLsEntry对象在片的第一个索引中的内存地址。

为什么sh.FilesLs(context.TODO(),"/.ipfs")失败?

好吧,FilesLs不是在查询你自己的操作系统运行的常规文件系统,而是MFS。MFS是本地存储的,但是使用add API不会自动向MFS添加内容。你可以使用FilesCp在你add之后给你的MFS添加一个CID。

如何在IPFS上列出我的目录?

这是一个有点棘手的问题。真正保留在IPFS上的数据要么是固定的数据,要么是在MFS中引用的数据。上面我们已经学习了FilesLs命令列出MFS上的文件/目录。要列出递归引脚(目录),使用命令行非常简单:
ipfs pin ls -t recursive

对于API,您首先需要调用Shell. pins()之类的东西,过滤出您想要的引脚(可能是快速扫描,取出递归的东西),然后使用Shell查询cid。ObjectStat或任何你喜欢的

如果使用引脚,请记住,它感觉不太像一个常规的可变文件系统,因为它不是。在添加到MFS中的cid中导航要容易得多。这就是我建议你在IPFS上列出目录的方式。

最新更新