//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还有点问题,部分文件下载时会报内存错误,需要继续学习研究