From f30fb4dc67c20e1d3ac45284a4011abb999dec26 Mon Sep 17 00:00:00 2001 From: Vladimir Hodakov Date: Sat, 22 Feb 2020 18:21:37 +0400 Subject: [PATCH] Fix error with "invalid link" on torrent renaming Now it uses custom trick instead of os.Rename(). --- domains/fetcher/v1/fetcher.go | 4 ++-- domains/fetcher/v1/mover.go | 42 +++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 domains/fetcher/v1/mover.go diff --git a/domains/fetcher/v1/fetcher.go b/domains/fetcher/v1/fetcher.go index f5f22f0..bc89cfa 100644 --- a/domains/fetcher/v1/fetcher.go +++ b/domains/fetcher/v1/fetcher.go @@ -1,6 +1,6 @@ // NNM-Club torrent filess mass downloader // Created for Uploaders group -// Copyright (c) 2012-2019 Vladimir "fat0troll" Hodakov +// Copyright (c) 2012-2020 Vladimir "fat0troll" Hodakov package fetcherv1 @@ -65,7 +65,7 @@ func download(topic *forumTopic) { result := outputDirPath + "/" + lastModified + "-" + sanitize.BaseName(topic.Name) + ".torrent" - err = os.Rename(tempF, result) + err = moveFile(tempF, result) if err != nil { dlog.Warn().Err(err).Str("название топика", topic.Name).Str("ссылка на топик", topic.Link). Msg("Не удалось сохранить торрент-файл. Пропуск") diff --git a/domains/fetcher/v1/mover.go b/domains/fetcher/v1/mover.go new file mode 100644 index 0000000..13b5cba --- /dev/null +++ b/domains/fetcher/v1/mover.go @@ -0,0 +1,42 @@ +// NNM-Club torrent filess mass downloader +// Created for Uploaders group +// Copyright (c) 2012-2020 Vladimir "fat0troll" Hodakov + +package fetcherv1 + +import ( + "fmt" + "io" + "os" +) + +// Source: https://gist.github.com/var23rav/23ae5d0d4d830aff886c3c970b8f6c6b + +/* + GoLang: os.Rename() give error "invalid cross-device link" for Docker container with Volumes. + moveFile(source, destination) will work moving file between folders +*/ + +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 destination 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 +}