How do I copy a file without overwriting an existing file in Go?

huangapple go评论73阅读模式
英文:

How do I copy a file without overwriting an existing file in Go?

问题

如何在文件存在的情况下,使用给定的名称创建一个新文件。

例如:如果word_destination.txt存在,则将内容复制到word_destination(1).txt。

任何帮助将不胜感激...

package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func main() {

	src := "./word_source.txt"
	desti := "./folder/word_destination.txt"

	// 如果文件存在,将其复制到word_destination(1).txt
	if _, err := os.Stat(desti); err == nil {
		// path/to/whatever 存在
		fmt.Println("文件存在")

	} else {
		fmt.Println("文件不存在")
		bytesRead, err := ioutil.ReadFile(src)

		if err != nil {
			log.Fatal(err)
		}
英文:

How to create a new file with the given name if the file exists

eg : if word_destination.txt exists copy content to word_destination(1).txt

Any help would be appreciated...

package main

import (
	"fmt"
	"io/ioutil"
	"os"
)


func main() {

	src := ./word_source.txt
	desti := ./folder/word_destination.txt

    //if file exists want to copy it to the word_destination(1).txt
	if _, err := os.Stat(desti); err == nil {
		// path/to/whatever exists
		fmt.Println("File Exists")

	} else {
		fmt.Println("File does not Exists")
		bytesRead, err := ioutil.ReadFile(src)

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

答案1

得分: -1

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

    out, err := os.OpenFile(dst, os.O_CREATE|os.O_EXCL, 0644)
    if err != nil {
        return err
    }
    defer out.Close()

    _, err = io.Copy(out, in)
    if err != nil {
        return err
    }
    return out.Close()
}

// ......
if _, err := os.Stat(desti); err == nil {
    // path/to/whatever exists
    fmt.Println("文件已存在")
    for i := 1; ; i++ {
        ext := filepath.Ext(desti)
        newpath := fmt.Sprintf("%s(%d)%s", strings.TrimSuffix(desti, ext), i, ext)

        err := tryCopy(desti, newpath)
        if err == nil {
            break
        }

        if os.IsExist(err) {
            continue
        } else {
            return err
        }
    }
}

以上是一段Go语言代码,实现了文件拷贝的功能。如果目标文件已经存在,则在文件名后面添加"(数字)"的方式进行重命名,直到找到一个可用的文件名为止。

英文:
func tryCopy(src, dst string) error {
    in, err := os.Open(src)
    if err != nil {
     	return err
    }
    defer in.Close()

    out, err := os.OpenFile(dst, os.O_CREATE| os.O_EXCL, 0644)
    if err != nil {
	    return err
    }
    defer out.Close()

    _, err = io.Copy(out, in)
    if err != nil {
	    return err
    }
    return out.Close()
}
// ......
if _, err := os.Stat(desti); err == nil {
    // path/to/whatever exists
    fmt.Println("File Exists")
    for i := 1; ; i++ {
		ext := filepath.Ext(desti)
		newpath := fmt.Sprintf("%s(%d)%s", strings.TrimSuffix(desti, ext), i, ext)

        err := tryCopy(desti, newpath)
        if err == nil {
            break;
        }
        
        if os.IsExists(err) {
            continue;
        } else {
            return err;
        }
	}
}

huangapple
  • 本文由 发表于 2021年10月7日 17:35:50
  • 转载请务必保留本文链接:https://go.coder-hub.com/69478817.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定