EasyDSSの開発過程では、一部のユーザーが使用中に誤って削除してしまったため、ユーザーが誤って削除しないように、ユーザーがアップロードした動画をバックアップする必要があります。
一般的に使用されるファイルコピー関数は、公式のgoライブラリが提供するio.Copy()メソッドを使用して直接実装されます。
nBytes, err := io.Copy(destination, source)
上記の方法は小さなファイルのコピーに適しています。500MBや1GBを超えるような非常に大きなファイルのコピーには問題があります。
io.Copy()メソッドの基本的なロジックは、すべてのソースファイルを一度にメモリに読み取り、メモリから新しいファイルにデータを書き込むことです。2 GBのビデオファイルを読み取るなどの大きなファイルの場合、一度に2 GBのメモリが消費されます。コンピュータのメモリ自体が小さい場合、プログラムは十分なメモリを提供しません。したがって、このメソッドを大きなファイルに対して直接呼び出すことはできません。
大きなファイルのコピー操作では、1024バイトなどの小さなデータを毎回読み取り、新しいファイルに書き込む必要があります。次に、ファイルを再度読み取り、すべてのデータが新しいファイルに書き込まれるまで、新しいファイルに書き込みます。
func Copy(src, dst string) (int64, error) {
sourceFileStat, err := os.Stat(src)
if err != nil {
return 0, err
}
if !sourceFileStat.Mode().IsRegular() {
return 0, fmt.Errorf("%s is not a regular file", src)
}
source, err := os.Open(src)
if err != nil {
return 0, err
}
defer source.Close()
destination, err := os.Create(dst)
if err != nil {
return 0, err
}
defer destination.Close()
//nBytes, err := io.Copy(destination, source)
nBytes := int64(0)
buf := make([]byte, 4096)
for {
n, err := source.Read(buf)
if err != nil && err != io.EOF {
return 0, err
}
if n == 0 {
break
}
if _, err := destination.Write(buf[:n]); err != nil {
return 0, err
}
// 更新写入的数量
nBytes = nBytes + int64(n)
}
return nBytes, err
}
ファイルを読み取るときに、EOFマークが検出されます。これは、ファイルが読み取られたことを意味します。上記のメソッドのコアコードは次のとおりです。
nBytes := int64(0)
buf := make([]byte, 4096)
for {
n, err := source.Read(buf)
if err != nil && err != io.EOF {
return 0, err
}
if n == 0 {
break
}
if _, err := destination.Write(buf[:n]); err != nil {
return 0, err
}
// 更新写入的数量
nBytes = nBytes + int64(n)
}
EasyDSSは、Tsingsee Videoが開発したインターネットビデオライブ/オンデマンドプラットフォームで、RTMPプロトコルのカメラや機器に接続して、ビデオモニタリング用のプッシュストリームアドレスを生成できます。EasyDSSを使用するユーザーは、豊富なAPIインターフェースを提供していることを知っており、開発者は二次開発、APIインターフェースの詳細を自由に実行できます:http ://demo.easydss.com:10080/apidoc 。