ホームページ >バックエンド開発 >Golang >Go でファイルを効率的かつ簡単にコピーするにはどうすればよいですか?

Go でファイルを効率的かつ簡単にコピーするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-13 01:43:02507ブラウズ

How to Copy Files Efficiently and Simply in Go?

Go での効率的かつシンプルなファイルのコピー

複雑なライブラリやオペレーティング システムに依存するコードに頼ることなく、Go でファイルを効率的にコピーします。さまざまなエッジケースを処理する堅牢な実装を使用して実現できます。

ハードの使用高速複製のためのリンク

既存のファイルを素早く複製する方法は、os.Link() 関数を使用することです。これにより、元のファイルと宛先ファイルの間にハード リンクが作成され、コピーを作成するのではなく、本質的に同じファイルになります。この方法では、特に大きなファイルの場合に、時間とディスク容量が節約されます。

さまざまなシステム制限の処理

ただし、ハード リンクには、オペレーティング システムとファイル システムに応じた制限があります。構成。たとえば、一部のシステムでは、異なるファイル システムまたはパーティション上のファイル間のハード リンクが許可されていません。

堅牢で汎用的なコピー関数

汎用かつ堅牢なコピー関数を作成するには場合は、次の手順を実行します。

  1. アクセス許可、ディレクトリの存在、その他の潜在的な問題を確認してから、次の手順を実行します。 copy.
  2. os.SameFile を使用して、両方のファイルが存在し、同一であるかどうかを確認します。存在する場合は、成功を返します。
  3. os.Link とのハード リンクを試みます。成功した場合は戻ります。
  4. 他のすべてが失敗した場合は、ファイルをバイト単位でコピーします。

最適化と簡素化

パフォーマンスを向上させるには、呼び出しスレッドのブロックを避けるために、バイトのコピーを別の go ルーチンで実行できます。ただし、これにより、成功または失敗を処理する呼び出し側の責任が複雑になります。

実装を容易にするために、同期コピーの CopyFile() と非同期コピーの CopyFileAsync() という 2 つの別々のコピー関数を作成できます。発信者へのシグナリング チャネル。

サンプルコード

提供されたコードは、バイト コピー フォールバックを実行する前にハード リンクを試みる堅牢な CopyFile 関数を示しています。

package main

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

func CopyFile(src, dst string) (err error) {
    // Validate input
    // ...

    if err = os.Link(src, dst); err == nil {
        return
    }
    err = copyFileContents(src, dst)
    return
}

func copyFileContents(src, dst string) (err error) {
    // Copy file contents
    // ...
    return
}

func main() {
    // ...
    err := CopyFile(os.Args[1], os.Args[2])
    if err != nil {
        // ...
    }
}

以上がGo でファイルを効率的かつ簡単にコピーするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。