代码拉取完成,页面将自动刷新
// Copyright 2024-2025 aesoper
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package fileutil
import (
"crypto/sha256"
"errors"
"fmt"
"io"
"os"
"path/filepath"
"time"
)
// CopyFile 复制文件从源路径到目标路径
func CopyFile(srcPath, dstPath string) error {
srcFile, err := os.Open(srcPath)
if err != nil {
return err
}
defer srcFile.Close()
dstFile, err := os.Create(dstPath)
if err != nil {
return err
}
defer dstFile.Close()
_, err = io.Copy(dstFile, srcFile)
return err
}
// DeleteFile 删除指定路径的文件
func DeleteFile(filePath string) error {
return os.Remove(filePath)
}
// IsExists 检查文件或目录是否存在
func IsExists(filePath string) bool {
_, err := os.Stat(filePath)
return !os.IsNotExist(err)
}
// IsNotExists 检查文件或目录是否不存在
func IsNotExists(filePath string) bool {
_, err := os.Stat(filePath)
return os.IsNotExist(err)
}
// ReadFile 读取文件内容并返回为字符串
func ReadFile(filePath string) (string, error) {
data, err := os.ReadFile(filePath)
if err != nil {
return "", err
}
return string(data), nil
}
// WriteFile 将字符串内容写入文件
func WriteFile(filePath, content string, mode os.FileMode) error {
if IsDir(filePath) {
return errors.New("file path is a directory")
}
if err := EnsureDir(filepath.Dir(filePath)); err != nil {
return err
}
return os.WriteFile(filePath, []byte(content), mode)
}
// ListFiles 列出指定目录中的所有文件
func ListFiles(dirPath string) ([]string, error) {
var files []string
err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() {
files = append(files, path)
}
return nil
})
return files, err
}
// CreateDir 创建目录及其父目录
func CreateDir(dirPath string) error {
return os.MkdirAll(dirPath, os.ModePerm)
}
// MoveFile 移动文件从源路径到目标路径
func MoveFile(srcPath, dstPath string) error {
if err := EnsureDir(filepath.Dir(dstPath)); err != nil {
return err
}
return os.Rename(srcPath, dstPath)
}
// IsFile 检查路径是否是普通文件
func IsFile(filePath string) bool {
info, err := os.Stat(filePath)
if err != nil {
return false
}
return !info.IsDir() && (info.Mode()&os.ModeSymlink == 0)
}
// IsDir 检查路径是否是目录
func IsDir(dirPath string) bool {
info, err := os.Stat(dirPath)
if err != nil {
return false
}
return info.IsDir()
}
// IsSymlink 检查路径是否是符号链接
func IsSymlink(filePath string) bool {
info, err := os.Lstat(filePath)
if err != nil {
return false
}
return info.Mode()&os.ModeSymlink != 0
}
// GetFileSize 获取文件大小
func GetFileSize(filePath string) (int64, error) {
info, err := os.Stat(filePath)
if err != nil {
return 0, err
}
return info.Size(), nil
}
// GetFileModTime 获取文件的最后修改时间
func GetFileModTime(filePath string) (time.Time, error) {
info, err := os.Stat(filePath)
if err != nil {
return time.Time{}, err
}
return info.ModTime(), nil
}
// CopyDir 复制整个目录及其内容
func CopyDir(srcDir, dstDir string) error {
return filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
relPath, err := filepath.Rel(srcDir, path)
if err != nil {
return err
}
dstPath := filepath.Join(dstDir, relPath)
if info.IsDir() {
return os.MkdirAll(dstPath, info.Mode())
}
return CopyFile(path, dstPath)
})
}
// GetFilePermissions 获取文件权限
func GetFilePermissions(filePath string) (os.FileMode, error) {
info, err := os.Stat(filePath)
if err != nil {
return 0, err
}
return info.Mode(), nil
}
// SetFilePermissions 设置文件权限
func SetFilePermissions(filePath string, mode os.FileMode) error {
return os.Chmod(filePath, mode)
}
// IsReadable 检查文件是否可读
func IsReadable(filePath string) bool {
file, err := os.OpenFile(filePath, os.O_RDONLY, 0)
if err != nil {
return false
}
file.Close()
return true
}
// IsWritable 检查文件是否可写
func IsWritable(filePath string) bool {
file, err := os.OpenFile(filePath, os.O_WRONLY, 0)
if err != nil {
return false
}
file.Close()
return true
}
// IsExecutable 检查文件是否可执行
func IsExecutable(filePath string) bool {
info, err := os.Stat(filePath)
if err != nil {
return false
}
// 检查是否是文件和可执行权限
return !info.IsDir() && (info.Mode()&0o111 != 0)
}
// GetCurrentDir 获取当前工作目录
func GetCurrentDir() string {
dir, err := os.Getwd()
if err != nil {
return ""
}
return dir
}
// GetFileContent 获取文件内容
func GetFileContent(filePath string) (string, error) {
content, err := os.ReadFile(filePath)
if err != nil {
return "", err
}
return string(content), nil
}
// IsEmptyDir 检查目录是否为空
func IsEmptyDir(dirPath string) (bool, error) {
files, err := ListFiles(dirPath)
if err != nil {
return false, err
}
return len(files) == 0, nil
}
// IsSameFile 检查两个文件是否相同
func IsSameFile(file1, file2 string) (bool, error) {
info1, err := os.Stat(file1)
if err != nil {
return false, err
}
info2, err := os.Stat(file2)
if err != nil {
return false, err
}
return os.SameFile(info1, info2), nil
}
// HashFile 计算文件的SHA256哈希值
func HashFile(filePath string) (string, error) {
content, err := os.ReadFile(filePath)
if err != nil {
return "", err
}
return fmt.Sprintf("%x", sha256.Sum256(content)), nil
}
// EnsureDir 确保目录存在
func EnsureDir(dir string) error {
absDir, err := filepath.Abs(dir)
if err != nil {
return err
}
if _, err := os.Stat(absDir); os.IsNotExist(err) {
return os.MkdirAll(absDir, os.ModePerm)
}
return nil
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。