(转) go官方嵌入文件到可执行程序

声明:内容源自网络,版权归原作者所有。若有侵权请在网页聊天中联系我

这是官方自带的文件嵌入。先看代码

package main

import (
    _ "embed"
)

//go:embed test.txt
var testString string  // 当前目录,解析为string类型

//go:embed test.txt
var testByte []byte  // 当前目录,解析为[]byte类型

//go:embed test/test.txt
var testAbsolutePath string  // 子目录,解析为string类型

//go:embed notExistsFile
var testErr0 string // 文件不存在,编译报错:pattern notExistsFile: no matching files found

//go:embed dir
var testErr1 string // dir是目录,编译报错:pattern dir: cannot embed directory dir: contains no embeddable files

//go:embed ../test.txt
var testErr2 string // 相对路径,不是当前目录或子目录,编译报错:pattern ../test.txt: invalid pattern syntax

//go:embed D:\test.txt
var testErr3 string // 绝对路径,编译报错:pattern D:\test.txt: no matching files found

func main() {
    println(testString)
    println(string(testByte))
    println(testAbsolutePath)
}
package main

import (
    "embed"
    "io"
    "os"
)

//go:embed test0.txt test1.txt test1*.txt
//go:embed test/test0.txt test/test1.txt
//go:embed test0
var fileList embed.FS
/*
使用上述方法可以将多个文件或目录添加到fileList中。
1. 添加多个文件,且支持"*"号通配文件。
2. 支持子目录文件。
3. 支持嵌入一个目录。
*/

func main() {
    testDir, err := fileList.ReadDir("test0")
    if err != nil {
        panic(err)
    }
    for _, v := range testDir {
        println(v.Name()) // 打印嵌入的目录内容
    }

    // 使用fileList.Open可以生成一个对象,可以通过文件流那样读出来
    testFile, err := fileList.Open("test0.txt")
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, testFile)

    testFile, err = fileList.Open("test112.txt")
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, testFile)

    testFile, err = fileList.Open("test/test1.txt")
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, testFile)

    // 直接将文件内容读出来
    data, err := fileList.ReadFile("test111.txt")
    if err != nil {
        panic(err)
    }
    println(string(data))
}

在项目中,需要将几十个音频文件放到一起,避免文件过多,且有初级的加密作用。

基于以上官方自带的功能,可以很方便的将这些资源文件嵌入到可执行文件中。

将此可执行文件作为一个中介,执行文件输出功能。例如: data.exe 内嵌文件名 导出文件名。

在以下代码中,加入了简单的密码授权。

我测试过嵌入音频和视频,视频单个文件超过750MB,总计33个文件1.5GB左右。生成可执行文件并运行没有问题。

试过第三方库,嵌入文件太大了不行。

package main

import (
	"embed"
	"io/ioutil"
	"os"
	"fmt"
)

const USEPASS="192939495969798999"

//go:embed res/*.smp
//go:embed res/*.mp4
var EmbedFileList embed.FS

func main() {
	if len(os.Args)==4 {
		password :=os.Args[1]    // 功能调用的密码
		inFile := os.Args[2] // 内嵌文件及路径
		outFile:=os.Args[3] // 输出文件及路径
		if password==USEPASS {
			fmt.Println("wait...")
			data, err := EmbedFileList.ReadFile(inFile)
			if err != nil {
				panic(err)
			} else {
				ioutil.WriteFile(outFile, data, 0644)
			}
		}
	}
}

相关文章