【问题标题】:Remove path from filename从文件名中删除路径
【发布时间】:2015-12-30 10:29:41
【问题描述】:

我有一个琐碎的问题。

我有一个包含文件名和路径的字符串。我怎样才能删除整个路径?我已经尝试过:

line = "/some/path/to/remove/file.name"
line := strings.LastIndex(line, "/")
fmt.Println(line)

它打印出一些奇怪的数字:

38

我需要它没有最后一个斜线

非常感谢

【问题讨论】:

  • “奇怪的数字”是字符串中最后一个“/”的位置。 LastIndex 返回请求的子字符串最后一次出现的字符串中的 *index"。

标签: go


【解决方案1】:

数字是字符串中最后一个斜杠的索引。如果要获取文件的基本名称,请使用filepath.Base:

path := "/some/path/to/remove/file.name"
file := filepath.Base(path)
fmt.Println(file)

游乐场:http://play.golang.org/p/DzlCV-HC-r.

【讨论】:

  • 非常感谢。刚找到 :) 本来打算把它贴在这里的,但你更快了 :)
  • 发现如果你的 Go 服务器在 Linux 上并且你的浏览器是 Windows 上的 Edge,这不起作用。当服务器在 Linux 上时,它不会剥离 Windows 路径:(
【解决方案2】:

你可以在playground试试看!

dir, file := filepath.Split("/some/path/to/remove/file.name")
fmt.Println("Dir:", dir)   //Dir: /some/path/to/remove/
fmt.Println("File:", file) //File: file.name

【讨论】:

  • 这实际上是一个正确的答案,因为 filepath.Base("/") 会给你“/”(根路径),而 filepath.Base("") 会给你“.”所以当前目录。对于这两种情况,在 filepath.Split() 中返回的文件都是空字符串。
  • 如果您的浏览器与您的服务器在不同的操作系统上,这也会失败。如果浏览器发送 Windows 目录并且您的服务器在 Linux 上,则会失败。 :(
【解决方案3】:

另一种选择:

package main
import "path"

func main() {
   line := "/some/path/to/remove/file.name"
   line = path.Base(line)
   println(line == "file.name")
}

https://golang.org/pkg/path#Base

【讨论】:

  • 也许你可以指出是否比公认的解决方案有优势......
【解决方案4】:

如果你想要没有文件名的基本路径,你可以使用 Dir,这里记录了:https://golang.org/pkg/path/filepath/#Dir

引用他们的部分文档:

Dir 返回除了路径的最后一个元素之外的所有元素,通常是路径的目录。删除最后一个元素后,Dir 在路径上调用 Clean 并删除尾部斜杠。

也来自他们的文档,运行此代码:

package main

import (
    "fmt"
    "path/filepath"
)

func main() {
    fmt.Println("On Unix:")
    fmt.Println(filepath.Dir("/foo/bar/baz.js"))
    fmt.Println(filepath.Dir("/foo/bar/baz"))
    fmt.Println(filepath.Dir("/foo/bar/baz/"))
    fmt.Println(filepath.Dir("/dirty//path///"))
    fmt.Println(filepath.Dir("dev.txt"))
    fmt.Println(filepath.Dir("../todo.txt"))
    fmt.Println(filepath.Dir(".."))
    fmt.Println(filepath.Dir("."))
    fmt.Println(filepath.Dir("/"))
    fmt.Println(filepath.Dir(""))

}

会给你这个输出:

在 Unix 上:

 /foo/bar
 /foo/bar
 /foo/bar/baz
 /dirty/path
 .
 ..
 .
 .
 /
 .

在这里自己尝试一下:

https://play.golang.org/p/huk3EmORFw5

如果您想要获取没有基本路径的文件名,@Ainar-G 已经充分回答了这个问题。

【讨论】:

    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 2014-03-16
    • 2011-04-22
    • 1970-01-01
    • 2012-03-29
    • 2015-08-17
    相关资源
    最近更新 更多