131 lines
3.2 KiB
Go
131 lines
3.2 KiB
Go
package filesystem
|
|
|
|
import (
|
|
"fmt"
|
|
"runtime"
|
|
)
|
|
|
|
// ErrorCode 错误码类型
|
|
type ErrorCode string
|
|
|
|
const (
|
|
// 通用错误
|
|
ErrCodeGeneral ErrorCode = "GENERAL_ERROR"
|
|
ErrCodeInvalid ErrorCode = "INVALID_ARGUMENT"
|
|
ErrCodeNotFound ErrorCode = "NOT_FOUND"
|
|
ErrCodePermission ErrorCode = "PERMISSION_DENIED"
|
|
ErrCodeIO ErrorCode = "IO_ERROR"
|
|
|
|
// 路径相关错误
|
|
ErrCodePathTraversal ErrorCode = "PATH_TRAVERSAL"
|
|
ErrCodeInvalidPath ErrorCode = "INVALID_PATH"
|
|
ErrCodeSensitivePath ErrorCode = "SENSITIVE_PATH"
|
|
|
|
// 文件操作错误
|
|
ErrCodeFileNotFound ErrorCode = "FILE_NOT_FOUND"
|
|
ErrCodeFileExists ErrorCode = "FILE_EXISTS"
|
|
ErrCodeDirectoryNotEmpty ErrorCode = "DIRECTORY_NOT_EMPTY"
|
|
|
|
// 安全相关错误
|
|
ErrCodeSecurityViolation ErrorCode = "SECURITY_VIOLATION"
|
|
ErrCodeSizeLimit ErrorCode = "SIZE_LIMIT_EXCEEDED"
|
|
ErrCodeFileLocked ErrorCode = "FILE_LOCKED"
|
|
|
|
// ZIP相关错误
|
|
ErrCodeZipInvalid ErrorCode = "ZIP_INVALID"
|
|
ErrCodeZipBomb ErrorCode = "ZIP_BOMB"
|
|
ErrCodeZipExtract ErrorCode = "ZIP_EXTRACT_FAILED"
|
|
)
|
|
|
|
// FileError 文件系统专用错误类型
|
|
// 包含详细的错误上下文信息,便于调试和用户提示
|
|
type FileNotFoundError struct {
|
|
Path string
|
|
Err error
|
|
}
|
|
|
|
func (e *FileNotFoundError) Error() string {
|
|
return fmt.Sprintf("文件不存在: %s", e.Path)
|
|
}
|
|
|
|
func (e *FileNotFoundError) Unwrap() error {
|
|
return e.Err
|
|
}
|
|
|
|
// PathValidationError 路径验证错误
|
|
type PathValidationError struct {
|
|
Path string
|
|
Reason string
|
|
IsSensitive bool
|
|
}
|
|
|
|
func (e *PathValidationError) Error() string {
|
|
return fmt.Sprintf("路径验证失败: %s - %s", e.Path, e.Reason)
|
|
}
|
|
|
|
// SecurityViolationError 安全违规错误
|
|
type SecurityViolationError struct {
|
|
Path string
|
|
Violation string
|
|
Suggestion string
|
|
}
|
|
|
|
func (e *SecurityViolationError) Error() string {
|
|
msg := fmt.Sprintf("安全违规: %s - %s", e.Path, e.Violation)
|
|
if e.Suggestion != "" {
|
|
msg += fmt.Sprintf("\n建议: %s", e.Suggestion)
|
|
}
|
|
return msg
|
|
}
|
|
|
|
// SizeLimitError 大小限制错误
|
|
type SizeLimitError struct {
|
|
Path string
|
|
ActualSize int64
|
|
MaxSize int64
|
|
SizeType string // "file" or "directory"
|
|
}
|
|
|
|
func (e *SizeLimitError) Error() string {
|
|
return fmt.Sprintf("%s大小超限: %s (实际: %.2f GB, 限制: %.2f GB)",
|
|
e.SizeType, e.Path,
|
|
float64(e.ActualSize)/(1024*1024*1024),
|
|
float64(e.MaxSize)/(1024*1024*1024),
|
|
)
|
|
}
|
|
|
|
// FileLockedError 文件锁定错误
|
|
type FileLockedError struct {
|
|
Path string
|
|
ProcessInfo string
|
|
}
|
|
|
|
func (e *FileLockedError) Error() string {
|
|
msg := fmt.Sprintf("文件被占用: %s", e.Path)
|
|
if e.ProcessInfo != "" {
|
|
msg += fmt.Sprintf("\n占用程序: %s", e.ProcessInfo)
|
|
}
|
|
return msg
|
|
}
|
|
|
|
// WrapError 错误包装函数
|
|
// 添加上下文信息到错误中
|
|
func WrapError(operation string, path string, err error) error {
|
|
return fmt.Errorf("%s 失败: %s - %w", operation, path, err)
|
|
}
|
|
|
|
// WrapErrorf 格式化错误包装
|
|
func WrapErrorf(format string, args ...interface{}) error {
|
|
return fmt.Errorf(format, args...)
|
|
}
|
|
|
|
// GetStackTrace 获取堆栈跟踪(用于调试)
|
|
func GetStackTrace(skip int) string {
|
|
buf := make([]byte, 4096)
|
|
n := runtime.Stack(buf, false)
|
|
if n > 0 {
|
|
return string(buf[:n])
|
|
}
|
|
return ""
|
|
}
|