花瓣小跑 发表于 2022-8-9 19:53:51

go入门项目:(2) 基于命令行的文件整理小项目

介绍

假设你之前下载的文件(音频,视频,文档,图片等)都下载到了一个文件夹里, 现在想把它们分类整理到相应的文件夹里去. 本文使用go实现这个小功能.
https://img2022.cnblogs.com/blog/2357964/202206/2357964-20220625232133436-977782830.gif
代码实现


[*]从命令行输入想要整理的目录
main.go
// 获取用户输入 - 目标文件夹需要整理
scanner := bufio.NewScanner(os.Stdin)
fmt.Print("你想整理哪个文件夹 - ")
scanner.Scan()

targetFolder := scanner.Text()
[*]判断是否存在该目录
v// 检查文件夹是否存在
_, err := os.Stat(targetFolder)
if os.IsNotExist(err) {
        log.Fatal("文件夹不存在")
} else {
        // 创建默认文件夹,如Images, Docs, Others, Videos
        createDefaultFolders(targetFolder)

        // 整理文件夹
        organizeFolder(targetFolder)
}
[*]分类处理
switch fileExt {
        case ".jpg", ".JPG", "png":
        newPath := filepath.Join(targetFolder, "Images", fileInfo.Name())
        err := os.Rename(oldPath, newPath)
        check(err)
        noOfFiles++
        case ".mp4", ".mov", ".avi", ".amv":
        newPath := filepath.Join(targetFolder, "Videos", fileInfo.Name())
        err := os.Rename(oldPath, newPath)
        check(err)
        noOfFiles++
        case ".pdf", ".docx", ".csv", ".xlsx":
        newPath := filepath.Join(targetFolder, "Docs", fileInfo.Name())
        err = os.Rename(oldPath, newPath)
        check(err)
        noOfFiles++
        default:
        newPath := filepath.Join(targetFolder, "Others", fileInfo.Name())
        err = os.Rename(oldPath, newPath)
        check(err)
        noOfFiles++
}
4. 根目录下使用go build生成可执行文件, 通过命令行执行该文件
```bash
go build完整代码

package main

import (
        "bufio"
        "fmt"
        "log"
        "os"
        "path/filepath"
)

func main() {
        // 获取用户输入 - 目标文件夹需要整理
        scanner := bufio.NewScanner(os.Stdin)
        fmt.Print("你想整理哪个文件夹 - ")
        scanner.Scan()

        targetFolder := scanner.Text()

        // targetFolder := "/home/cenjw/Downloads/Inspackage"

        // 检查文件夹是否存在
        _, err := os.Stat(targetFolder)
        if os.IsNotExist(err) {
                log.Fatal("文件夹不存在")
        } else {
                // 创建默认文件夹,如Images, Docs, Others, Videos
                createDefaultFolders(targetFolder)

                // 整理文件夹
                organizeFolder(targetFolder)
        }
}

// function to Oraganize folders
func organizeFolder(targetFolder string) {
        // 读取目录
        filesAndFolders, err := os.ReadDir(targetFolder)
        check(err)

        // 统计有多少文件需要被移动
        noOfFiles := 0

        for _, filesAndFolder := range         filesAndFolders {
                // 如果是文件就移动到相应的文件夹
                if !filesAndFolder.IsDir() {
                        fileInfo, err := filesAndFolder.Info()
                        check(err)

                        // 获取文件的绝对路径
                        oldPath := filepath.Join(targetFolder, fileInfo.Name())
                        fileExt := filepath.Ext(oldPath) // 返回指定路径使用的文件扩展名 如 ".csv"

                        switch fileExt {
                        case ".jpg", ".JPG", "png":
                                newPath := filepath.Join(targetFolder, "Images", fileInfo.Name())
                                err := os.Rename(oldPath, newPath)
                                check(err)
                                noOfFiles++
                        case ".mp4", ".mov", ".avi", ".amv":
                                newPath := filepath.Join(targetFolder, "Videos", fileInfo.Name())
                                err := os.Rename(oldPath, newPath)
                                check(err)
                                noOfFiles++
                        case ".pdf", ".docx", ".csv", ".xlsx":
                                newPath := filepath.Join(targetFolder, "Docs", fileInfo.Name())
                                err = os.Rename(oldPath, newPath)
                                check(err)
                                noOfFiles++
                        default:
                                newPath := filepath.Join(targetFolder, "Others", fileInfo.Name())
                                err = os.Rename(oldPath, newPath)
                                check(err)
                                noOfFiles++
                        }
                }
        }

        if noOfFiles > 0 {
                fmt.Printf("%v number of files moved\n", noOfFiles)
        } else {
                fmt.Printf("No files moved")
        }
}

func check(err error) {
        if err != nil {
                log.Fatal(err)
        }
}

// function to create default folders such as Images, Docs, Others, Videos
func createDefaultFolders(targetFolder string) {
        defaultFolders := []string{"Videos", "Docs", "Images", "Others"}

        for _, folder := range defaultFolders {
                _, err := os.Stat(folder)
                if os.IsNotExist(err) {
                        os.Mkdir(filepath.Join(targetFolder, folder), 0755)
                }
        }
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: go入门项目:(2) 基于命令行的文件整理小项目