Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 1 addition & 7 deletions asar/asar.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package asar

import (
"errors"
"fmt"
"io"
"os"
"path/filepath"
Expand Down Expand Up @@ -87,9 +86,7 @@ func CreatePackageFromFiles(src, dest string, filenames []string, metadata map[s
} else {
line = strings.TrimSpace(line)
}
if strings.HasPrefix(line, "/") {
line = line[1:]
}
line = strings.TrimPrefix(line, "/")
comps := strings.Split(line, string(os.PathSeparator))
cur := src
for _, c := range comps {
Expand Down Expand Up @@ -204,7 +201,6 @@ func CreatePackageFromFiles(src, dest string, filenames []string, metadata map[s
return err
}
}
fmt.Println("文件条目:", len(files), "链接条目:", len(links))
// 写入 header
tmpFS := &Filesystem{}
tmpFS.SetHeader(root, 0)
Expand Down Expand Up @@ -375,8 +371,6 @@ func isOutOf(base, p string) bool {
return strings.HasPrefix(filepath.ToSlash(r), "..")
}

func mustStat(p string) os.FileInfo { fi, _ := os.Lstat(p); return fi }

func mustRealpath(p string) string {
a, _ := filepath.EvalSymlinks(p)
if a == "" {
Expand Down
112 changes: 64 additions & 48 deletions asar/crawl.go
Original file line number Diff line number Diff line change
@@ -1,70 +1,86 @@
package asar

import (
"io"
"os"
"path/filepath"
"io"
"os"
"path/filepath"
)

// CrawledFileType 表示爬取到的条目信息
type CrawledFileType struct {
Type string // file | directory | link
Stat os.FileInfo
Type string // file | directory | link
Stat os.FileInfo
}

// DetermineFileType 判断文件类型
func DetermineFileType(filename string) (*CrawledFileType, error) {
fi, err := os.Lstat(filename)
if err != nil { return nil, err }
if fi.Mode()&os.ModeSymlink != 0 { return &CrawledFileType{Type: "link", Stat: fi}, nil }
if fi.IsDir() { return &CrawledFileType{Type: "directory", Stat: fi}, nil }
return &CrawledFileType{Type: "file", Stat: fi}, nil
fi, err := os.Lstat(filename)
if err != nil {
return nil, err
}
if fi.Mode()&os.ModeSymlink != 0 {
return &CrawledFileType{Type: "link", Stat: fi}, nil
}
if fi.IsDir() {
return &CrawledFileType{Type: "directory", Stat: fi}, nil
}
return &CrawledFileType{Type: "file", Stat: fi}, nil
}

// Crawl 递归遍历目录,返回路径列表与元数据
func Crawl(root string, includeDot bool) ([]string, map[string]*CrawledFileType, error) {
meta := map[string]*CrawledFileType{}
files := make([]string, 0)
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if err != nil { return err }
// 过滤隐藏(任一路径段以 . 开头)
if !includeDot && path != root {
rel, _ := filepath.Rel(root, path)
parts := filepath.SplitList(filepath.ToSlash(rel))
// SplitList 不适合通用,这里按 '/'
parts = splitBySlash(rel)
for _, p := range parts {
if len(p) > 0 && p[0] == '.' {
if info.IsDir() { return filepath.SkipDir }
return nil
}
}
}
if path == root { return nil }
typ, err := DetermineFileType(path)
if err != nil { return err }
meta[path] = typ
files = append(files, path)
return nil
})
if err != nil { return nil, nil, err }
return files, meta, nil
meta := map[string]*CrawledFileType{}
files := make([]string, 0)
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
// 过滤隐藏(任一路径段以 . 开头)
if !includeDot && path != root {
rel, _ := filepath.Rel(root, path)
parts := filepath.SplitList(filepath.ToSlash(rel))
// SplitList 不适合通用,这里按 '/'
parts = splitBySlash(rel)
for _, p := range parts {
if len(p) > 0 && p[0] == '.' {
if info.IsDir() {
return filepath.SkipDir
}
return nil
}
}
}
if path == root {
return nil
}
typ, err := DetermineFileType(path)
if err != nil {
return err
}
meta[path] = typ
files = append(files, path)
return nil
})
if err != nil {
return nil, nil, err
}
return files, meta, nil
}

// StreamGenerator 为生成读取流的函数类型
type StreamGenerator func() (io.ReadCloser, error)

func splitBySlash(s string) []string {
s = filepath.ToSlash(s)
out := make([]string, 0)
cur := 0
b := []byte(s)
for i := 0; i < len(b); i++ {
if b[i] == '/' {
out = append(out, string(b[cur:i]))
cur = i + 1
}
}
out = append(out, string(b[cur:]))
return out
s = filepath.ToSlash(s)
out := make([]string, 0)
cur := 0
b := []byte(s)
for i := 0; i < len(b); i++ {
if b[i] == '/' {
out = append(out, string(b[cur:i]))
cur = i + 1
}
}
out = append(out, string(b[cur:]))
return out
}
Loading
Loading