Golang使用goftp列出文件夹时遇到的问题
Golang使用goftp列出文件夹时遇到的问题 我尝试列出位于FTP服务器根目录下的libs文件夹,为此我执行了以下操作:
files, err := sc.ReadDir("/libs")
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to list remote dir: %v\n", err)
return err
}
但当我这样做时,我得到了:
Unexpected response: 501-No such directory.
我使用了“GitHub - secsy/goftp: FTP client for golang”这个库。
我尝试过使用“/libs”、“libs”、“libs/”、“/libs”这些路径,但都不起作用。
你能帮助我吗?
你知道我为什么会收到这个错误吗?
更多关于Golang使用goftp列出文件夹时遇到的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
理论上是使用相对路径来导航层级结构,或者在连接后向服务器请求当前工作目录(PWD),并据此构建绝对路径。
更多关于Golang使用goftp列出文件夹时遇到的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我建议您尝试使用FTP客户端登录,并检查是否能访问该文件夹作为故障排除步骤。我认为只要那是一个客户端有权访问的有效目录,您的代码就应该能正常工作。
是的,但在这种情况下,我如何才能访问位于FTP服务器根目录下,而非Linux服务器根目录下的文件夹呢?(该文件夹位于 /home/user/ 中,但FTP用户只能访问 /home/user/,他无法看到 /)
我不太确定你的具体配置,但这很可能是因为你无法直接访问目标服务器的整个文件系统。假设FTP服务器被设置为从 /var/ftp-files 或类似目录提供内容。当你使用 ReadDir 读取 /libs 目录时,它实际上会在服务器上寻找 /var/ftp-files/libs 这个路径。我的意思是——显然你不会希望FTP客户端能够访问你的整个文件系统,对吧?总之,可能的原因有很多,但这是我的最佳猜测。
这个错误通常是因为FTP服务器对路径处理方式与你的预期不同。以下是几个可能的原因和解决方案:
1. 检查当前工作目录
FTP服务器可能不是从根目录开始的,你需要先确认当前目录:
// 获取当前工作目录
curDir, err := sc.CurrentDir()
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to get current dir: %v\n", err)
return err
}
fmt.Printf("Current directory: %s\n", curDir)
// 然后尝试列出
files, err := sc.ReadDir("libs")
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to list remote dir: %v\n", err)
return err
}
2. 使用绝对路径的正确方式
如果确实需要从根目录开始,确保使用正确的绝对路径:
// 先切换到根目录
err := sc.ChangeDir("/")
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to change to root dir: %v\n", err)
return err
}
// 然后列出libs目录
files, err := sc.ReadDir("libs")
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to list remote dir: %v\n", err)
return err
}
3. 直接使用完整路径
或者直接使用完整路径:
// 列出根目录下的libs文件夹
files, err := sc.ReadDir("/libs")
if err != nil {
// 如果失败,尝试其他方式
fmt.Fprintf(os.Stderr, "First attempt failed: %v\n", err)
// 尝试相对路径
files, err = sc.ReadDir("libs")
if err != nil {
fmt.Fprintf(os.Stderr, "Second attempt failed: %v\n", err)
return err
}
}
4. 使用List方法作为备选方案
如果ReadDir仍然有问题,可以尝试使用List方法:
// 使用List方法获取目录内容
lines, err := sc.List("/libs")
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to list with List method: %v\n", err)
return err
}
for _, line := range lines {
fmt.Println(line)
}
5. 完整的示例代码
这是一个完整的示例,展示了如何正确处理目录列表:
package main
import (
"fmt"
"os"
"github.com/secsy/goftp"
)
func main() {
config := goftp.Config{
User: "username",
Password: "password",
}
client, err := goftp.DialConfig(config, "ftp.example.com:21")
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to connect: %v\n", err)
return
}
defer client.Close()
// 检查当前目录
curDir, err := client.CurrentDir()
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to get current dir: %v\n", err)
return
}
fmt.Printf("Current directory: %s\n", curDir)
// 尝试列出libs目录
files, err := client.ReadDir("libs")
if err != nil {
fmt.Fprintf(os.Stderr, "Attempt 1 failed: %v\n", err)
// 尝试切换到根目录再列出
err = client.ChangeDir("/")
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to change to root: %v\n", err)
return
}
files, err = client.ReadDir("libs")
if err != nil {
fmt.Fprintf(os.Stderr, "Attempt 2 failed: %v\n", err)
return
}
}
// 处理文件列表
for _, file := range files {
fmt.Printf("Name: %s, Size: %d, IsDir: %v\n",
file.Name(), file.Size(), file.IsDir())
}
}
错误"501 No such directory"表明服务器找不到指定的路径。最常见的原因是当前工作目录不是根目录,或者FTP服务器的根目录结构与你的预期不同。建议先用CurrentDir()检查当前目录,然后根据实际情况调整路径。

