我在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上列出目录的方式。