Golang实现根据用户输入路径和文件名创建目录并复制文件

Golang实现根据用户输入路径和文件名创建目录并复制文件 你好。可以帮帮我吗?如何输入新目录的创建路径,并将指定文件从另一个文件夹复制到那里?

我只实现了在程序所在位置创建目录。

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

func main() {
	wd, err := os.Getwd()
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	fmt.Println("Working Directory:", wd)
	fmt.Println("Application:", filepath.Join(wd, os.Args[0]))
	d := filepath.Join(wd, "test")
	if err := os.Mkdir(d, 0755); err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println("Created", d)
	if err := os.Chdir(d); err != nil {
		fmt.Println("Error:", err)
		return
	}
	fmt.Println("New Working Directory:", d)
}

更多关于Golang实现根据用户输入路径和文件名创建目录并复制文件的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

你好,Vlad,

mishchuk_vlad: 如何输入新目录将被创建的路径

你的意思是想要交互式地提示用户输入路径,还是希望在程序启动时指定路径(例如通过命令行参数或开关)?如果是前者,你可以使用 fmt 包中的“Print 系列”函数(例如 PrintlnPrintfFprintf 等)来打印路径问题,并使用“Scan 系列”函数(例如 Scanln)来读取用户的输入。如果是后者,你可以查阅 flag 包,它提供了像 flag.Stringflag.StringVar 这样的函数,让你可以定义能在命令行中使用的标志。

mishchuk_vlad: 并从另一个文件文件夹复制指定的文件到那里

据我所知,Go 中没有像 Python 的 shutil 包那样内置的简单文件复制方法,不过我确实找到了该包的一个移植版本在这里。我从未使用过它,无法提供意见。相反,你需要:

  1. 使用类似 os.Open 的方法打开源文件进行读取,完成后别忘了关闭它!
  2. 使用类似 os.Create 的方法创建/覆盖目标文件进行写入,完成后别忘了关闭它!
  3. 使用类似 io.Copy 的方法将数据从源文件复制到目标文件。注意参数的顺序!

我每次都说“类似…的方法”,因为你的情况可能需要更多的控制。如果你需要以特定标志打开文件,你可能需要使用 os.OpenFile 或其他方法来打开文件。如果你需要追加到现有文件而不是覆盖,那么你需要使用带有特定标志的 os.OpenFile,等等。

更多关于Golang实现根据用户输入路径和文件名创建目录并复制文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


以下是实现根据用户输入路径创建目录并复制文件的完整代码示例:

package main

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

func main() {
	// 读取用户输入的目录路径
	fmt.Print("请输入目标目录路径: ")
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	targetDir := scanner.Text()

	// 创建目录(包括父目录)
	if err := os.MkdirAll(targetDir, 0755); err != nil {
		fmt.Printf("创建目录失败: %v\n", err)
		return
	}
	fmt.Printf("目录创建成功: %s\n", targetDir)

	// 读取用户输入的源文件路径
	fmt.Print("请输入源文件路径: ")
	scanner.Scan()
	sourceFile := scanner.Text()

	// 获取源文件名
	fileName := filepath.Base(sourceFile)
	
	// 构建目标文件路径
	targetFile := filepath.Join(targetDir, fileName)

	// 复制文件
	if err := copyFile(sourceFile, targetFile); err != nil {
		fmt.Printf("复制文件失败: %v\n", err)
		return
	}
	
	fmt.Printf("文件复制成功: %s -> %s\n", sourceFile, targetFile)
}

// copyFile 复制文件函数
func copyFile(src, dst string) error {
	// 打开源文件
	source, err := os.Open(src)
	if err != nil {
		return err
	}
	defer source.Close()

	// 创建目标文件
	destination, err := os.Create(dst)
	if err != nil {
		return err
	}
	defer destination.Close()

	// 复制文件内容
	_, err = io.Copy(destination, source)
	return err
}

如果需要从命令行参数获取输入,可以使用以下版本:

package main

import (
	"fmt"
	"io"
	"os"
	"path/filepath"
)

func main() {
	if len(os.Args) != 3 {
		fmt.Println("用法: program <目标目录> <源文件>")
		fmt.Println("示例: program /home/user/newdir /home/user/documents/file.txt")
		return
	}

	targetDir := os.Args[1]
	sourceFile := os.Args[2]

	// 创建目录
	if err := os.MkdirAll(targetDir, 0755); err != nil {
		fmt.Printf("创建目录失败: %v\n", err)
		return
	}

	// 获取文件名并构建目标路径
	fileName := filepath.Base(sourceFile)
	targetFile := filepath.Join(targetDir, fileName)

	// 复制文件
	if err := copyFile(sourceFile, targetFile); err != nil {
		fmt.Printf("复制文件失败: %v\n", err)
		return
	}

	fmt.Printf("成功: 已将 %s 复制到 %s\n", sourceFile, targetFile)
}

func copyFile(src, dst string) error {
	source, err := os.Open(src)
	if err != nil {
		return err
	}
	defer source.Close()

	destination, err := os.Create(dst)
	if err != nil {
		return err
	}
	defer destination.Close()

	_, err = io.Copy(destination, source)
	return err
}

第一个版本通过标准输入交互式获取路径,第二个版本通过命令行参数获取。两个版本都使用 os.MkdirAll() 创建目录(包括不存在的父目录),使用 io.Copy() 进行文件复制操作。

回到顶部