package server import ( "encoding/binary" "errors" "fmt" "io/fs" "io/ioutil" "os" "path/filepath" "strings" "sync" ) type PathInfo struct { Dirs []string // 目录路径(包含所有层级) Files []string // 文件路径 } var pathPool = sync.Pool{ New: func() interface{} { return &PathInfo{ Dirs: make([]string, 0, 1024), // 预分配容量 Files: make([]string, 0, 4096), } }, } func GetPathInfo(root string) (*PathInfo, error) { //获取文件名 index := strings.LastIndex(root, "/") if index == -1 { index = strings.LastIndex(root, "\\") } // 复用对象减少内存分配[9](@ref) info := pathPool.Get().(*PathInfo) // 路径有效性校验[5,6](@ref) root = filepath.Clean(root) stat, err := os.Stat(root) if err != nil { if errors.Is(err, fs.ErrNotExist) { return nil, &os.PathError{Op: "stat", Path: root, Err: err} // 增强错误信息[8](@ref) } return nil, err } // 文件直接返回[4](@ref) if !stat.IsDir() { info.Files = append(info.Files, root) return info, nil } // 使用WalkDir优化遍历性能[4,9](@ref) err = filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error { if err != nil { // 处理遍历错误但继续执行[7](@ref) if errors.Is(err, fs.ErrPermission) { return nil // 跳过权限错误 } return err } // 排除根目录自身 if path == root { return nil } // 动态扩容检测[9](@ref) if len(info.Dirs)+len(info.Files) > 1e8 { return errors.New("超出内存安全阈值(1,000,000条路径)") } //fmt.Println(path[len(RootFileName):]) if d.IsDir() { info.Dirs = append(info.Dirs, path) } else { info.Files = append(info.Files, path) } return nil }) if err != nil { return nil, &os.PathError{Op: "walk", Path: root, Err: err} // 错误包装[6](@ref) } return info, nil } type FileHandler struct{} func (handler FileHandler) ReadFileToCommand(filePath string) { _, err := GetPathInfo(filePath) if err != nil { fmt.Println(err) } } func (handler FileHandler) CreateCommand(path string) error { // 获取文件信息 fileInfo, err := os.Stat(path) if err != nil { return fmt.Errorf("路径获取失败: %v", err) } // 判断文件类型 if fileInfo.IsDir() { // 处理目录 fmt.Printf("文件夹内容 [%s]:\n", path) files, err := ioutil.ReadDir(path) if err != nil { return fmt.Errorf("目录读取失败: %v", err) } for _, f := range files { fmt.Println(f.Name()) } } else { // 处理文件 fmt.Printf("文件内容 [%s]:\n", path) data, err := ioutil.ReadFile(path) if err != nil { return fmt.Errorf("文件读取失败: %v", err) } // 打印前512字节的十六进制预览 maxPreview := 512 if len(data) < maxPreview { maxPreview = len(data) } fmt.Printf("大小: %d 字节\n", len(data)) fmt.Printf("前%d字节预览(HEX):\n%x", maxPreview, data[:maxPreview]) } return nil } func CreateDirCommand(info os.FileInfo, baseUrl string, transactionId string) { bytes := []byte{ 0x00, } for i := 0; i < 32; i++ { bytes = append(bytes, byte(i+3)) } var fileName = info.Name() //文件名长度 bytes = binary.BigEndian.AppendUint32(bytes, uint32(len(fileName))) //文件名 bytes = append(bytes, []byte(fileName)...) //文件大小 bytes = binary.BigEndian.AppendUint64(bytes, uint64(info.Size())) var path = "file/" + fileName bytes = binary.BigEndian.AppendUint32(bytes, uint32(len(path))) //文件路径 bytes = append(bytes, []byte(path)...) //分片大小 bytes = binary.BigEndian.AppendUint32(bytes, uint32(0)) //创建时间 bytes = binary.BigEndian.AppendUint64(bytes, uint64(1999)) //修改时间 bytes = binary.BigEndian.AppendUint64(bytes, uint64(19999)) //最后访问时间 bytes = binary.BigEndian.AppendUint64(bytes, uint64(199999)) } func (handler FileHandler) ParsingByteArray() {}