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

介绍

假设你之前下载的文件(音频,视频,文档,图片等)都下载到了一个文件夹里, 现在想把它们分类整理到相应的文件夹里去. 本文使用go实现这个小功能.

image

本文来自博客园,作者:Arway,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/gobeginner-proj-organize-folder.html

代码实现

  1. 从命令行输入想要整理的目录
    main.go

    // 获取用户输入 - 目标文件夹需要整理
    scanner := bufio.NewScanner(os.Stdin)
    fmt.Print("你想整理哪个文件夹 - ")
    scanner.Scan()
    
    targetFolder := scanner.Text()
    
  2. 判断是否存在该目录

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

	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++
	}
  1. 根目录下使用go build生成可执行文件, 通过命令行执行该文件
    go build

本文来自博客园,作者:Arway,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/gobeginner-proj-organize-folder.html

完整代码

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)
		}
	}
}

posted on 2022-06-25 00:02  micromatrix  阅读(74)  评论(0编辑  收藏  举报

导航