使用Go将文件移动到其他驱动器

时间:2018-06-07 12:11:05

标签: go

我试图使用os.Replace()将文件从我的C盘移动到我的H盘。

代码如下:

func MoveFile(source string, destination string) {
    err := os.Rename(source, destination)
    if err != nil {
        fmt.Println(err)
    }
}

但是,当我运行代码时,我收到以下错误:

rename C:\old\path\to\file.txt H:\new\path\to\file.txt: The system cannot move the file to a different disk drive.

我在GitHub上发现this问题指出了问题,但似乎他们不会更改此功能以允许它在不同的磁盘驱动器上移动文件。

我已经搜索过移动文件的其他可能性,但在标准文档或互联网上没有找到任何内容。

那么,我现在该怎么做才能在不同的磁盘驱动器上移动文件?

3 个答案:

答案 0 :(得分:10)

正如评论所说,您需要在另一个磁盘上创建一个新文件,复制内容,然后删除原始文件。使用os.Createio.Copyos.Remove直截了当:

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

func MoveFile(sourcePath, destPath string) error {
    inputFile, err := os.Open(sourcePath)
    if err != nil {
        return fmt.Errorf("Couldn't open source file: %s", err)
    }
    outputFile, err := os.Create(destPath)
    if err != nil {
        inputFile.Close()
        return fmt.Errorf("Couldn't open dest file: %s", err)
    }
    defer outputFile.Close()
    _, err = io.Copy(outputFile, inputFile)
    inputFile.Close()
    if err != nil {
        return fmt.Errorf("Writing to output file failed: %s", err)
    }
    // The copy was successful, so now delete the original file
    err = os.Remove(sourcePath)
    if err != nil {
        return fmt.Errorf("Failed removing original file: %s", err)
    }
    return nil
}

答案 1 :(得分:0)

您需要确保在Linux和Windows上处理所有情况。例如,对于任何大小的文件,

var map1 = Immutable.Map({ 'selector': 'bar' });
var map2 = map1.setIn(['selector', 'bar'], 'foo');

输出(Linux):

package main

import (
    "flag"
    "fmt"
    "io"
    "os"
)

func MoveFile(source, destination string) (err error) {
    src, err := os.Open(source)
    if err != nil {
        return err
    }
    defer src.Close()
    fi, err := src.Stat()
    if err != nil {
        return err
    }
    flag := os.O_WRONLY | os.O_CREATE | os.O_TRUNC
    perm := fi.Mode() & os.ModePerm
    dst, err := os.OpenFile(destination, flag, perm)
    if err != nil {
        return err
    }
    defer dst.Close()
    _, err = io.Copy(dst, src)
    if err != nil {
        dst.Close()
        os.Remove(destination)
        return err
    }
    err = dst.Close()
    if err != nil {
        return err
    }
    err = src.Close()
    if err != nil {
        return err
    }
    err = os.Remove(source)
    if err != nil {
        return err
    }
    return nil
}

func main() {
    var src, dst string
    flag.StringVar(&src, "src", "", "source file")
    flag.StringVar(&dst, "dst", "", "destination file")
    flag.Parse()
    if src == "" || dst == "" {
        flag.Usage()
        os.Exit(1)
    }

    err := MoveFile(src, dst)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
    fmt.Printf("moved %q to %q\n", src, dst)
}

输出(Windows):

$ cp move.file src.file && go build movefile.go && ./movefile -src=src.file -dst=dst.file
moved "src.file" to "dst.file"
$

答案 2 :(得分:0)

此解决方案移动文件并保留权限:

func MoveFile(src, dst string) error {
    in, err := os.Open(src)
    if err != nil {
        return fmt.Errorf("Couldn't open source file: %s", err)
    }

    out, err := os.Create(dst)
    if err != nil {
        in.Close()
        return fmt.Errorf("Couldn't open dest file: %s", err)
    }
    defer out.Close()

    _, err = io.Copy(out, in)
    in.Close()
    if err != nil {
        return fmt.Errorf("Writing to output file failed: %s", err)
    }

    err = out.Sync()
    if err != nil {
        return fmt.Errorf("Sync error: %s", err)
    }

    si, err := os.Stat(src)
    if err != nil {
        return fmt.Errorf("Stat error: %s", err)
    }
    err = os.Chmod(dst, si.Mode())
    if err != nil {
        return fmt.Errorf("Chmod error: %s", err)
    }

    err = os.Remove(src)
    if err != nil {
        return fmt.Errorf("Failed removing original file: %s", err)
    }
    return nil
}

如果只想复制而不删除原始文件:

func CopyFile(src, dst string) error {
    in, err := os.Open(src)
    if err != nil {
        return fmt.Errorf("Couldn't open source file: %s", err)
    }

    out, err := os.Create(dst)
    if err != nil {
        in.Close()
        return fmt.Errorf("Couldn't open dest file: %s", err)
    }
    defer out.Close()

    _, err = io.Copy(out, in)
    in.Close()
    if err != nil {
        return fmt.Errorf("Writing to output file failed: %s", err)
    }

    err = out.Sync()
    if err != nil {
        return fmt.Errorf("Sync error: %s", err)
    }

    si, err := os.Stat(src)
    if err != nil {
        return fmt.Errorf("Stat error: %s", err)
    }
    err = os.Chmod(dst, si.Mode())
    if err != nil {
        return fmt.Errorf("Chmod error: %s", err)
    }

    return nil
}