123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- package filemanager
- import (
- "io"
- "os"
- "path/filepath"
- "strings"
- )
- // isValidFilename checks if a given filename is safe and valid.
- func isValidFilename(filename string) bool {
- // Define a list of disallowed characters and reserved names
- disallowedChars := []string{"/", "\\", ":", "*", "?", "\"", "<", ">", "|"} // Add more if needed
- reservedNames := []string{"CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9"} // Add more if needed
- // Check for disallowed characters
- for _, char := range disallowedChars {
- if strings.Contains(filename, char) {
- return false
- }
- }
- // Check for reserved names (case-insensitive)
- lowerFilename := strings.ToUpper(filename)
- for _, reserved := range reservedNames {
- if lowerFilename == reserved {
- return false
- }
- }
- // Check for empty filename
- if filename == "" {
- return false
- }
- // The filename is considered valid
- return true
- }
- // sanitizeFilename sanitizes a given filename by removing disallowed characters.
- func sanitizeFilename(filename string) string {
- disallowedChars := []string{"/", "\\", ":", "*", "?", "\"", "<", ">", "|"} // Add more if needed
- // Replace disallowed characters with underscores
- for _, char := range disallowedChars {
- filename = strings.ReplaceAll(filename, char, "_")
- }
- return filename
- }
- // copyFile copies a single file from source to destination
- func copyFile(srcPath, destPath string) error {
- srcFile, err := os.Open(srcPath)
- if err != nil {
- return err
- }
- defer srcFile.Close()
- destFile, err := os.Create(destPath)
- if err != nil {
- return err
- }
- defer destFile.Close()
- _, err = io.Copy(destFile, srcFile)
- if err != nil {
- return err
- }
- return nil
- }
- // copyDirectory recursively copies a directory and its contents from source to destination
- func copyDirectory(srcPath, destPath string) error {
- // Create the destination directory
- err := os.MkdirAll(destPath, os.ModePerm)
- if err != nil {
- return err
- }
- entries, err := os.ReadDir(srcPath)
- if err != nil {
- return err
- }
- for _, entry := range entries {
- srcEntryPath := filepath.Join(srcPath, entry.Name())
- destEntryPath := filepath.Join(destPath, entry.Name())
- if entry.IsDir() {
- err := copyDirectory(srcEntryPath, destEntryPath)
- if err != nil {
- return err
- }
- } else {
- err := copyFile(srcEntryPath, destEntryPath)
- if err != nil {
- return err
- }
- }
- }
- return nil
- }
- // isDir checks if the given path is a directory
- func isDir(path string) bool {
- fileInfo, err := os.Stat(path)
- if err != nil {
- return false
- }
- return fileInfo.IsDir()
- }
- // calculateDirectorySize calculates the total size of a directory and its contents
- func calculateDirectorySize(dirPath string) (int64, error) {
- var totalSize int64
- err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
- if err != nil {
- return err
- }
- totalSize += info.Size()
- return nil
- })
- if err != nil {
- return 0, err
- }
- return totalSize, nil
- }
- // countSubFilesAndFolders counts the number of sub-files and sub-folders within a directory
- func countSubFilesAndFolders(dirPath string) (int, int, error) {
- var numSubFiles, numSubFolders int
- err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
- if err != nil {
- return err
- }
- if info.IsDir() {
- numSubFolders++
- } else {
- numSubFiles++
- }
- return nil
- })
- if err != nil {
- return 0, 0, err
- }
- // Subtract 1 from numSubFolders to exclude the root directory itself
- return numSubFiles, numSubFolders - 1, nil
- }
|