Go语言 之文件目录操作训练

1.从用户给出的目录中,找出所有的 .jpg 文件。

package main

import (
    "fmt"
    "os"
    "strings"
)

func findFile(path string, files *[]string) {
    //以只读的形式打开目录
    f, err := os.OpenFile(path, os.O_RDONLY, os.ModeDir)
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(-1)
    }
    defer f.Close()
    //-1 读取所有的
    fileInfo, _ := f.Readdir(-1)
    separator := string(os.PathSeparator)
    for _, file := range fileInfo {
        newPath := path + separator + file.Name()
        //判读是否为目录
        if file.IsDir() {
            findFile(newPath, files)
        } else {
            //判读文件是否以.jpg结尾
            if strings.HasSuffix(newPath, ".jpg") {
                *files = append(*files, newPath)
            }
        }
    }
}

//从用户给出的目录中,找出所有的 .jpg 文件。
func main() {
    var path string
    fmt.Print("请输入目录:")
    fmt.Scan(&path)
    files := make([]string, 0)
    //递归遍历目录查找文件
    findFile(path, &files)
    fmt.Println(files)
}

 

2.从用户给出的目录中,拷贝 .mp3文件到指定目录中。

package main

import (
    "fmt"
    "io"
    "os"
    "strings"
)

//查找文件
func DoFindFile(srcPath string, dstPath string) {
    //以只读的形式打开目录
    f, err := os.OpenFile(srcPath, os.O_RDONLY, os.ModeDir)
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(-1)
    }
    defer f.Close()
    //-1 读取所有的
    fileInfo, _ := f.Readdir(-1)
    separator := string(os.PathSeparator)
    for _, file := range fileInfo {
        newPath := srcPath + separator + file.Name()
        //判读是否为目录
        if file.IsDir() {
            DoFindFile(newPath, dstPath)
        } else {
            //判读文件是否以.jpg结尾
            if strings.HasSuffix(newPath, ".mp3") {
                //拷贝文件到指定目录
                copyFile(newPath, dstPath, file.Name(), separator)
            }
        }
    }
}

//拷贝文件
func copyFile(srcPath string, dstPath string, fileName string, separator string) {
    //以只读方式打开文件
    srcF, err := os.Open(srcPath)
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    defer srcF.Close()
    //创建目的文件
    dstF, err := os.OpenFile(dstPath+separator+fileName, os.O_CREATE, os.ModePerm)
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    defer dstF.Close()
    buf := make([]byte, 1024)
    for {
        n, errB := srcF.Read(buf)
        if errB != nil && errB != io.EOF {
            break
        }
        if n == 0 {
            fmt.Println("拷贝完成")
            break
        }
        tmp := buf[:n]
        dstF.Write(tmp)
    }
}

func main() {
    var srcPath string
    var dstPath string
    fmt.Print("请输入源路径:")
    fmt.Scan(&srcPath)
    fmt.Print("请输入目的路径:")
    fmt.Scan(&dstPath)
    //判断两个路径是否相同
    if strings.ToLower(srcPath) == strings.ToLower(dstPath) {
        fmt.Println("源路径与目的路径一致")
        return
    }
    //查找文件
    DoFindFile(srcPath, dstPath)
}
posted @ 2019-07-02 16:24  样子2018  阅读(509)  评论(0编辑  收藏  举报