英文:
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;
}
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论