La plataforma de video del protocolo RTMP EasyDSS realiza una función de copia de archivos de gran tamaño a través de Golang. Método de copia de seguridad de archivos

En el proceso de desarrollo de EasyDSS, debido a que algunos usuarios han eliminado por error durante el uso, necesitamos hacer una copia de seguridad de los videos subidos por los usuarios para evitar que los usuarios eliminen por error. Este proceso requiere copiar archivos.

Las funciones de copia de archivos más utilizadas se implementan directamente mediante el método io.Copy () proporcionado por la biblioteca oficial de go.

nBytes, err := io.Copy(destination, source)

El método anterior es adecuado para copiar archivos pequeños. Para archivos muy grandes, como 500 MB o incluso más de 1 GB, habrá problemas.

La lógica básica del método io.Copy () es leer todos los archivos de origen en la memoria a la vez y luego escribir los datos de la memoria en el nuevo archivo. Para archivos más grandes, como leer un archivo de video de 2GB, se consumirán 2GB de memoria a la vez. Si la memoria de la computadora es pequeña, el programa no proporcionará memoria suficiente. Por lo tanto, este método no debe invocarse directamente para archivos más grandes.

Para operaciones de copia de archivos más grandes, los datos pequeños, como 1024 bytes, deben leerse cada vez y escribirse en un archivo nuevo. Luego, vuelva a leer el archivo y escriba en el nuevo archivo hasta que todos los datos se escriban en el nuevo archivo.

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
}

Al leer un archivo, se encuentra la marca EOF, lo que significa que el archivo se ha leído. El código central del método anterior es el siguiente.

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 es una plataforma de video en vivo / bajo demanda de Internet desarrollada por Tsingsee Video. Puede conectarse a cámaras y equipos con protocolo RTMP y generar una dirección de transmisión push para monitoreo de video. Los usuarios que utilizan EasyDSS saben que proporcionamos una gran cantidad de interfaces API, los desarrolladores pueden realizar libremente el desarrollo secundario, detalles de la interfaz API: http://demo.easydss.com:10080/apidoc.

Supongo que te gusta

Origin blog.csdn.net/EasyDSS/article/details/108766657
Recomendado
Clasificación