gdf

package module
v1.1.12 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 7, 2024 License: MulanPSL-2.0 Imports: 15 Imported by: 0

README

gdf

介绍

使用Golang编写的文件下载模块,基于原作者分享内容进行微改,如侵权请联系我关闭该项目

Golang多线程下载器(附代码、可执行文件)

使用方法

安装
go get -u gitee.com/liumou_site/gdf

效果

PS D:\CODE\gitee\go\GoSpeed> go get -u gitee.com/liumou_site/gdf
go: downloading gitee.com/liumou_site/gdf v0.0.0-20240604135521-0c8596721dd1
go: downloading golang.org/x/sys v0.20.0
go: added gitee.com/liumou_site/gdf v0.0.0-20240604135521-0c8596721dd1
go: upgraded github.com/mattn/go-isatty v0.0.16 => v0.0.20
go: upgraded github.com/spf13/cast v1.5.0 => v1.6.0
go: upgraded golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab => v0.20.0
PS D:\CODE\gitee\go\GoSpeed> 

使用

// 测试单线程下载并临时保存到缓存区
func TestSingleness_DownLoadDefaultSinglenessBuff(t *testing.T) {
	// 读取文件
	file := "url.txt"
	f, err := os.Open(file)
	if err != nil {
		t.Fatal(err)
	}

	defer func(f *os.File) {
		err := f.Close()
		if err != nil {
			t.Fatal(err)
		}
	}(f)

	// 创建一个新的Scanner来逐行读取文件
	scanner := bufio.NewScanner(f)

	// 循环读取每一行
	for scanner.Scan() {
		// 打印当前行的内容
		fmt.Println(scanner.Text())
		s, errs := NewSingleness(scanner.Text(), "test.txt")
		if errs != nil {
			t.Fatal(errs)
		}
		s.Debug = true
		err := s.DownLoadDefaultSinglenessBuff()
		if err != nil {
			logger.Warn(err)
		}
	}

}

效果

=== RUN   TestSingleness_DownLoadDefaultSinglenessBuff
https://dldir1.qq.com/qqfile/qq/QQNT/Windows/QQ_9.9.10_240523_x64_01.exe
[2024-06-06 21:10:06] [DEBG] [base:37] File size: 183 MB
[2024-06-06 21:10:06] [DEBG] [base:39] File type -> application/octet-stream
[2024-06-06 21:10:06] [DEBG] [base:41] File length -> 183
[2024-06-06 21:10:13] [INFO] [buff:32] File downloaded successfully.
https://mirrors.cloud.tencent.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-2207-02.iso
[2024-06-06 21:10:17] [DEBG] [base:37] File size: 988 MB
[2024-06-06 21:10:17] [DEBG] [base:39] File type -> application/octet-stream
[2024-06-06 21:10:17] [DEBG] [base:41] File length -> 988
[2024-06-06 21:10:17] [EROR] [base:44] Error: File size is too large
[2024-06-06 21:10:17] [DEBG] [base:45] 当前设置最大大小为: 500 MB
[2024-06-06 21:10:17] [DEBG] [base:46] 当前文件大小为: 988 MB
[2024-06-06 21:10:17] [WARN] [Singlengle_test:74] error: File size is too large
--- PASS: TestSingleness_DownLoadDefaultSinglenessBuff (11.60s)
PASS

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func DownloadFile

func DownloadFile(urls, file string, threadCount int)

DownloadFile 下载文件并自定义保存文件路径

func DownloadFileDefault

func DownloadFileDefault(urls, folders string, threadCount int)

DownloadFileDefault 下载文件并使用URL最后一组作为文件名,例如http://qq/QQ9.6.2.exe则使用QQ9.6.2.exe

func GetBytesFile

func GetBytesFile(filename string, bufferSize int) []byte

GetBytesFile 读取指定文件的所有内容到字节切片。 filename: 需要读取的文件名。 bufferSize: 读取时使用的缓冲区大小。 返回值: 文件的内容作为字节切片,如果读取失败或文件不存在,则返回nil。

func GetContentLength added in v1.1.10

func GetContentLength(url string, debug bool) (ContentSize int, ContentLength int64, err error)

GetContentLength 获取文件长度(字节&MB)

func GetFileSize

func GetFileSize(file string)

GetFileSize 获取文件大小

func GetRangeStatus added in v1.1.9

func GetRangeStatus(url string) bool

GetRangeStatus 判断是否支持分片下载Range

func IsEnoughMem added in v1.1.11

func IsEnoughMem(size, free int64) bool

IsEnoughMem 判断系统剩余内存是否足够创建缓存区 size 单位为 MB 返回 true 表示足够创建缓存区,否则返回 false

func SafeMkdir

func SafeMkdir(folder string)

SafeMkdir 检查指定的文件夹是否存在,如果不存在,则尝试创建它。 参数:

folder - 需要检查或创建的文件夹路径。

SafeMkdir 不返回任何值,但它可能在尝试创建文件夹时遇到错误。

func TestDownload

func TestDownload(urlStr string, perThreadSize int) (int, map[int]string, []string, string, error)

func Version

func Version()

Types

type DownloadFileParams

type DownloadFileParams struct {
	UrlStr       string // UrlStr 用于指定待下载文件的URL。
	RangeStr     string // RangeStr 用于指定下载文件时的范围,例如通过HTTP Range请求。
	RangeIndex   int    // RangeIndex 表示范围字符串中的起始索引,用于解析和处理范围请求。
	TempFilename string // TempFilename 是下载过程中临时文件的名称,用于存储部分或完整文件。
	Successes    bool   // Successes 标志下载操作是否成功,可用于后续处理或错误处理。
}

DownloadFileParams 定义了下载文件时所需的参数。 它包含了下载的URL、范围字符串、范围索引、临时文件名和下载是否成功的标志。

type DownloadTask

type DownloadTask struct {
	// contains filtered or unexported fields
}

DownloadTask 定义了一个下载任务的结构体。 它包含一个自定义函数和相应的参数信息,用于执行特定的下载任务。

type DownloadThreadController

type DownloadThreadController struct {
	TaskQueue              chan DownloadTask       // 用于接收下载任务
	TaskCount              chan int                // 用于记载当前任务数量
	Exit                   chan int                // 用于记载当前任务数量
	ThreadCount            int                     // 最大协程数
	WaitGroup              sync.WaitGroup          // 等待协程完成
	RangeStrs              map[int]string          // 所有需要下载的文件名
	FileUrl                string                  // 下载链接
	DownloadResultInfoChan chan DownloadFileParams // 下载任务响应通道
	DownloadFolder         string                  // 下载文件保存文件夹
	DownloadFileName       string                  // 下载文件保存文件名
	Filenames              []string                // 子文件名,有序
	Save                   bool                    // 是否保存文件
}

DownloadThreadController 下载线程控制器

func New

New 创建多线程下载对象

func (*DownloadThreadController) Init

func (controller *DownloadThreadController) Init()

func (*DownloadThreadController) Run

func (controller *DownloadThreadController) Run()

Run 方法启动下载线程控制器,负责调度和执行下载任务。 它遍历控制器中的所有下载范围字符串,并为每个范围创建一个下载任务。 控制器根据配置决定是保存文件到指定名称还是使用临时文件名。 此方法通过向任务队列中添加任务来启动下载过程。

type Singleness added in v1.1.7

type Singleness struct {
	Request    *http.Request // Request 是一个HTTP请求对象,用于发送下载请求。
	File       *os.File      // File 是一个文件对象,用于存储下载的文件内容。
	FileSize   int64         // FileSize 表示下载文件的大小,用于计算下载进度。
	FileName   string        // FileName 是下载文件的名称,用于保存到本地。
	FileUrl    string        // FileUrl 是下载文件的URL,用于记录下载文件的来源。
	Debug      bool          // Debug 用于启用或禁用调试模式,在调试模式下可以打印下载过程中的信息。
	SaveToDisk bool          // 是否保存到硬盘
	Error      error         // Error 用于记录下载过程中发生的错误。
	MaxSize    int64         // MaxSize 用于限制下载文件的最大大小,超过限制会中断下载,默认: 500MB
}

Singleness 单文件下载

func NewSingleness added in v1.1.7

func NewSingleness(url, filename string) (*Singleness, error)

NewSingleness 创建单线程下载对象

func (*Singleness) DownLoadDefault added in v1.1.9

func (s *Singleness) DownLoadDefault() error

DownLoadDefault 发起HTTP GET请求下载指定文件。 本方法封装了下载过程中的请求构建和错误处理,以及实际的下载逻辑。 它使用了Singleness结构体的成员来存储请求URL、保存到磁盘的路径、是否开启调试模式以及文件名。 返回值为错误对象,如果下载过程中出现错误,则会返回相应的错误。

func (*Singleness) DownLoadDefaultBuff added in v1.1.9

func (s *Singleness) DownLoadDefaultBuff() error

DownLoadDefaultBuff 下载默认的单曲缓冲区。 该方法用于发起一个HTTP GET请求,下载指定URL的文件,但不会将文件保存到磁盘。 它主要配置了请求的URL、请求头,并通过内部的setHeader函数进一步配置请求头。 如果在请求过程中发生了错误,错误将被记录并返回。 参数:

s *Singleness: 包含请求URL、错误信息、是否保存到磁盘和调试信息的结构体指针。

返回值:

error: 如果在请求过程中发生错误,返回该错误;否则返回nil。

type Thread added in v1.1.9

type Thread struct {
	ThreadCount      int      // 最大协程数
	SuppressRange    bool     // 是否支持分片下载
	FileUrl          string   // 下载链接
	SaveToDisk       bool     // 是否保存到硬盘
	DownloadFolder   string   // 下载文件保存文件夹
	ContentLength    int64    // 文件长度
	ContentSize      int      // 文件大小(MB)
	Filenames        []string // 子文件名,有序
	DownloadFileName string   // 下载文件保存文件名
	//RangeStrs        map[int]string // 所有需要下载的文件名
	Exit      bool           // 用于结束下载
	Debug     bool           // 是否开启调试
	Error     error          // 错误
	Request   *http.Request  // Request 是一个HTTP请求对象,用于发送下载请求。
	File      *os.File       // File 是一个文件对象,用于存储下载的文件内容。
	WaitGroup sync.WaitGroup // 等待协程完成
	Length    int64          // 设置单次下载长度,默认: 长度(ContentLength)除以线程数(ThreadCount)
	MemFree   int64          // 设置最小剩余内存,当剩余内存小于该数值则等待内存释放,默认: 100MB
}

Thread 创建一个下载线程控制器

func NewThread added in v1.1.9

func NewThread(url string) *Thread

NewThread 创建一个新的Thread实例。 它通过给定的URL初始化Thread对象,并设置初始配置,如线程数和文件URL。 参数:

url - 需要下载的文件的URL。

返回值:

*Thread - 初始化后的Thread实例。

func (*Thread) DownLoadBuff added in v1.1.9

func (t *Thread) DownLoadBuff() error

DownLoadBuff 通过协程下载到缓存区,如果不支持分片下载则使用单线程下载

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL