fullpath.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package util
  2. import (
  3. "path/filepath"
  4. "strings"
  5. )
  6. type FullPath string
  7. func NewFullPath(dir, name string) FullPath {
  8. name = strings.TrimSuffix(name, "/")
  9. return FullPath(dir).Child(name)
  10. }
  11. func (fp FullPath) DirAndName() (string, string) {
  12. dir, name := filepath.Split(string(fp))
  13. name = strings.ToValidUTF8(name, "?")
  14. if dir == "/" {
  15. return dir, name
  16. }
  17. if len(dir) < 1 {
  18. return "/", ""
  19. }
  20. return dir[:len(dir)-1], name
  21. }
  22. func (fp FullPath) Name() string {
  23. _, name := filepath.Split(string(fp))
  24. name = strings.ToValidUTF8(name, "?")
  25. return name
  26. }
  27. func (fp FullPath) IsLongerFileName(maxFilenameLength uint32) bool {
  28. if maxFilenameLength == 0 {
  29. return false
  30. }
  31. return uint32(len([]byte(fp.Name()))) > maxFilenameLength
  32. }
  33. func (fp FullPath) Child(name string) FullPath {
  34. dir := string(fp)
  35. noPrefix := name
  36. if strings.HasPrefix(name, "/") {
  37. noPrefix = name[1:]
  38. }
  39. if strings.HasSuffix(dir, "/") {
  40. return FullPath(dir + noPrefix)
  41. }
  42. return FullPath(dir + "/" + noPrefix)
  43. }
  44. // AsInode an in-memory only inode representation
  45. func (fp FullPath) AsInode(unixTime int64) uint64 {
  46. inode := uint64(HashStringToLong(string(fp)))
  47. inode = inode + uint64(unixTime)*37
  48. return inode
  49. }
  50. // split, but skipping the root
  51. func (fp FullPath) Split() []string {
  52. if fp == "" || fp == "/" {
  53. return []string{}
  54. }
  55. return strings.Split(string(fp)[1:], "/")
  56. }
  57. func Join(names ...string) string {
  58. return filepath.ToSlash(filepath.Join(names...))
  59. }
  60. func JoinPath(names ...string) FullPath {
  61. return FullPath(Join(names...))
  62. }
  63. func (fp FullPath) IsUnder(other FullPath) bool {
  64. if other == "/" {
  65. return true
  66. }
  67. return strings.HasPrefix(string(fp), string(other)+"/")
  68. }
  69. func StringSplit(separatedValues string, sep string) []string {
  70. if separatedValues == "" {
  71. return nil
  72. }
  73. return strings.Split(separatedValues, sep)
  74. }