扒过来的下载函数

//download 文件下载库
//小肥羊自用下载库
//v1.0.1 2023-6-10
//2023-6-11 修复downfile3提前关闭报错的问题
/*使用方法:
	import yang.download;
	yang.downFile(url)		//方法源自精易模块方案
	yang.downFile2(url,savedir)		//方法源自精易模块方案
	yang.downFile3(url,savename,savedir,openit) //方法采用curl下载
*/
import inet.url;
import yang;
namespace yang;

/*downloadform{{*/
var   ddform=
/*****
import win.ui;

var winform = win.form(text="aardio form";right=439;bottom=119;border="none")
winform.add(
bk={cls="bk";text="   单文件下载工具";left=0;top=0;right=440;bottom=28;align="left";bgcolor=36864;color=16777215;forecolor=32768;linearGradient=0;z=3};
button={cls="button";text="打开文件";left=369;top=63;right=433;bottom=85;z=6};
button2={cls="button";text="打开目录";left=299;top=63;right=363;bottom=85;z=7};
checkbox={cls="checkbox";text="完成后打开文件";left=317;top=39;right=429;bottom=57;z=2};
plus={cls="plus";left=6;top=65;right=102;bottom=83;align="right";z=4};
plus2={cls="plus";left=8;top=34;right=284;bottom=59;align="left";z=5};
plus3={cls="plus";left=103;top=65;right=199;bottom=83;align="left";z=8};
plus4={cls="plus";left=196;top=65;right=292;bottom=83;z=9};
progress={cls="progress";left=3;top=88;right=438;bottom=118;edge=1;max=100;min=0;z=1}
)


import win.ui.simpleWindow2;
win.ui.simpleWindow2(winform)
import curl;
import process;
cc = curl.easy();
import fsys.file;

var thread_fun = function(url,savedir,winform){
	import curl;
	import win;
	cc = curl.easy();
	import fsys.file;
	fp = fsys.file(savedir,"w+");	
	cc.onProgress = function(buffer,downloadTotal,downloadNow,uploadTotal,uploadNow){	
		all = math.round(downloadTotal/1024/1024,2);
		down = math.round(downloadNow/1024/1024,2);		
		pos = math.round(down/all*100);
		winform.progress.pos = pos;		
		if(downloadTotal>0 && downloadTotal=downloadNow && fp) {
			fp.close();
			try{
				winform.plus.text = "下载完成"
				if(winform.checkbox.checked){
					import process;
					process.execute(savedir);
					winform.close();
				}
			}
		}
		else{
			winform.plus.text = tostring(down) ++"MB"
			winform.plus3.text =" / " + tostring(all)+"MB"
			winform.plus4.text = tostring(pos)+"%"
		}
	}	
	cc.onReceive = function(buffer,size,nmemb){		
		ss = fp.writeBuffer(buffer,nmemb);	
		return nmemb;
	}
	winform.plus2.text = savedir;
	cc.get(url);
}

winform.start_download = function(url,savename,savedir,openit=false){
	if(openit) winform.checkbox.checked=true;
	if(savedir)savename = io.joinpath(savedir,savename);
	import yang;
	yang.createParent(savename);
	thread.invoke(thread_fun,url,savename,winform)
}

winform.button.oncommand = function(id,event){
	ss = winform.plus2.text;
	if(io.exist(ss)){
		process.execute(ss);
		winform.close();
	}
}

winform.button2.oncommand = function(id,event){
	ss = winform.plus2.text;
	if(io.exist(ss)){
		import fsys;
		process.execute(fsys.getParentDir(ss));
		winform.close();
	}
}

winform.show();
win.loopMessage();
return winform;
*****/
/*}}*/

var shdocvw = ..raw.loadDll("shdocvw.dll");
var wininet = ..raw.loadDll("wininet.dll");
var urlmon = ..raw.loadDll("urlmon.dll");


downFile = function(url){
	url = ..inet.url.encodeUri(url)
	shdocvw.DoFileDownloadW(url)
}

downFile2 = function(url,savedir,openIt=false){
	..yang.createParent(savedir)	
	wininet.DeleteUrlCacheEntry(url);
	url = ..inet.url.encodeUri(url);	
	res = urlmon.URLDownloadToFileW(0, url, savedir, 0, 0)
	if(res==0){
		if(..io.exist(savedir)){			
			ff = ..fsys.fileInfo(savedir);
			if(ff){
				if(openIt){
					import process;
					process.execute(savedir);
				}
				return true,..math.round(tonumber(ff.size)/1024,0) ++ " KB";
			}
			else return false,"写入数据失败"; 
		}else{
			return false,"创建文件失败"; 
		}
	}else{
		return false,"下载失败"; 
	}
}



downFile3 = function(url,savename,savedir,openit=false){
	var dlf = ..win.loadForm(ddform);
	url = ..inet.url.encodeUri(url);	
	dlf.start_download(url,savename,savedir,openit);
}


downFile4 = function(url,savepath,callback){
	var dwFlags=0
	var hOpen;
	var strAgent = "Agent" + ..tostring(..time.tick()); 
	wininet.InternetGetConnectedState(dwFlags, 0)
	if((dwFlags & 2#100)==0){
		hOpen = wininet.InternetOpenA (strAgent, 4, 0, 0, 0)
	}else{
		hOpen = wininet.InternetOpenA (strAgent, 0, 0, 0, 0)
	}
	if(hOpen==0) return -1; 
	var szHead = "Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0(compatible; MSIE 6.0; Windows NT 5.0; MyIE2; .NET CLR 1.1.4322)";
	var szTemp = ..raw.buffer(10240,0);
	var hConnect = wininet.InternetOpenUrlA (hOpen, url, szHead, ..string.len(szHead), 2214592768, 0);
	if(hConnect==0) return -2; 
	var dwByteToRead = {int a=0};
	var dwSizeOfRq = 4;
	var dwBytes = 0;
	var fp = ..fsys.file(savepath,"w+");
	if(fp==0) return -3; 
	if(wininet.HttpQueryInfoA(hConnect, 536870917, dwByteToRead, dwSizeOfRq, 0) = 0){
		dwByteToRead.a = 0
	}
	..console.dump(dwByteToRead.a)
	var starttime = ..time.tick()	
	var endtime = 0
	var usetime = 10
	while(true){
		dwSize={int a=0}
		if(wininet.InternetReadFile (hConnect, szTemp, 10240, dwSize) == 0){
			fp.close();
			return -4; 
		}
		if(dwSize.a==0) break;
		
		fp.writeBuffer(szTemp,dwSize.a)
		dwBytes = dwBytes + dwSize.a
		endtime = ..time.tick();
		usetime = endtime - starttime;
		if(usetime==0) usetime=10;
		if callback  callback(dwByteToRead.a,dwBytes,usetime)
	}
	fp.close();
	wininet.InternetCloseHandle (hOpen)
	return 0; 
}



namespace  download;

/**intellisense(yang)
download = 小肥羊下载库
downFile(url)=下载文件,@1为url,弹出windows下载对话框
downFile2(url,savedir)=下载文件,@1为url,@2为保存地址,需要含有文件名,@3下载完成后打开文件,默认返回结果状态和文件大小
downFile3(url,savename,savedir,openit) = 简单文件下载,有简单下载窗口供用户操作\n@1下载url地址,\n@2存储文件名(如果@3有参数,则需要用相对路径)\n@3存储用目录,\n@4下载完成是否直接打开文件
end intellisense**/

目前downFile4还有点问题,部分文件下载时会报内存错误,需要继续学习研究

关键词: aardio