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