功能
- 根据静态服务器上基础的url,获取所有的文件
运用到的知识点
- 日志处理
- 能在控制台打印,又能写入文件
- 向服务端发送get请求
- http.Get(url)
- 递归获取文件夹和创建文件夹
package main
import (
? "fmt"
? "io"
? "io/ioutil"
? "log"
? "net/http"
? "os"
? "regexp"
? "strings"
? "time"
)
var (
? baseurl = "基础url"
? basePath = "D:\\staticFile" //本地地址
? logger *log.Logger
)
func init(){
? fmt.Println("创建日记录日志文件")
? f,err:=os.OpenFile("Log.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 666)
? if err!=nil{
? log.Fatal("os.OpenFile err",err)
? }
? writers := []io.Writer{
? f,
? os.Stdout}
? //defer f.Close() 因为这里,就已经将文件关闭了,看来不能够随便使用defer
? fileAndStdoutWriter := io.MultiWriter(writers...)
? logger = log.New(fileAndStdoutWriter, "", log.Ldate|log.Ltime|log.Lshortfile)
? logger.Println("---> logger:check to make sure is works")
}
func main(){
? logger.Println("开始计算时间")
? t1:=time.Now()
? HandleFile(baseurl)
? t2:=time.Now()
? logger.Println("下载所有的文件总耗时:",t2.Sub(t1))
}
//遍历指定路径下的所有文件,filepath.Walk("路径",walkFunc)
func walkFunc(path string,info os.FileInfo,err error)error{
? fmt.Println(path)
? return nil
}
//处理文件信息
func HandleFile(url string)error{
? if url==""{
? err:=fmt.Errorf("url是空的")
? logger.Println(err)
? return err
? }
? logger.Println("发起get请求")
? htmlData,err:= HttpGet(url)
? if htmlData==""{
? err:=fmt.Errorf("HttpGet中有错啦,请检查HttpGet数据")
? logger.Println(err)
? return err
? }
? if err!=nil{
? logger.Println(err)
? return err
? }
? cutUrl := strings.Split(url,"基础url")[1]
? logger.Println("正则匹配信息")
? re:=regexp.MustCompile(<a href="(.*?)">(.*?)</a>)
? result := re.FindAllStringSubmatch(htmlData,-1)
? if result==nil{
? err:=fmt.Errorf("正则匹配的数据为空")
? logger.Println(err)
? return err
? }
? logger.Println("正则匹配数据")
? for i:=0;i<len(result);i++{
? publicPath := cutUrl
? if len(result[i])!=3{
? err:=fmt.Errorf("正则出来的东西不是我想要的")
? logger.Println(err)
? return err
? }
? fmt.Println(result[i][2])
? if strings.Contains(result[i][2],"/"){
? logger.Println(result[i][2]+"是个文件夹")
? floderName:=strings.Replace(result[i][2],"/","",-1)
? if floderName!=result[i][2]{
? publicPath = publicPath+"/"+floderName
? fmt.Println("publicPath=============>",publicPath)
? logger.Println("创建文件夹")
? err=CreateFloder(publicPath)
? if err!=nil{
? logger.Println("CreateFloder error",err)
? return err
? }
? urlPath := baseurl+publicPath+"/"
? fmt.Println("urlPath============>",urlPath)
? logger.Println("递归")
? HandleFile(urlPath)
? }
? }else{
? publicPath = publicPath+result[i][2]
? logger.Println("遇到是文件,就将数据写入文件")
? err:=WriteFile(publicPath)
? if err!=nil{
? logger.Println(err)
? return err
? }
? }
? }
? return nil
}
//发起get请求
func HttpGet(url string)(string,error){
? if url==""{
? err:= fmt.Errorf("传入的url为空")
? logger.Println(err)
? return "",err
? }
? if !strings.Contains(url,"http:"){
? err:=fmt.Errorf("传入的url不正确")
? logger.Println(err)
? return "",err
? }
? resp,err:=http.Get(url)
? if err!=nil{
? err1:= fmt.Errorf("http.Get error===========>%v",err)
? logger.Println(err1)
? return "",err1
? }
? defer resp.Body.Close()
? body,err := ioutil.ReadAll(resp.Body)
? if err!=nil{
? err1:=fmt.Errorf("ioutil.ReadAll error===========>%v",err)
? logger.Println(err1)
? return "",err1
? }
? if strings.Contains(string(body),"404 page not found"){
? err:=fmt.Errorf("找不到该网页")
? logger.Println(err)
? return "",err
? }
? return string(body),nil
}
//判断文件是否存在
func IsExist(path string)(bool){
? if path==""{
? return false
? }
? _,err:=os.Stat(path)
? if err!=nil{
? if os.IsExist(err){
? return true
? }else{
? return false
? }
? }
? return true
}
//创建文件夹
func CreateFloder(publicPath string)(error){
? if publicPath==""{
? err:=fmt.Errorf("传入urlpath的地址空")
? logger.Println(err)
? return err
? }
? logger.Println(publicPath,"创建文件夹")
? err:=os.MkdirAll(basePath+"//"+publicPath,os.ModePerm)
? if err!=nil{
? err:=fmt.Errorf("创建文件错误啦:%v",err)
? logger.Println(err)
? return err
? }
? return nil
}
//写入文件
func WriteFile(publicPath string)error{
? if publicPath==""{
? err:=fmt.Errorf("传入的参数为空,请注意!!!")
? logger.Println(err)
? return err
? }
? htmlData,err:=HttpGet(baseurl+publicPath)
? if htmlData==""{
? err:=fmt.Errorf("HttpGet中有错啦,请检查HttpGet数据")
? logger.Println(err)
? return err
? }
? if err!=nil{
? logger.Println(err)
? return err
? }
? file,err:=os.Create(basePath+publicPath)
? defer file.Close()
? if err!=nil{
? err:=fmt.Errorf("os.Open失败,err=%v",err)
? logger.Println(err)
? return err
? }
? if file==nil{
? err:=fmt.Errorf("创建文件失败")
? logger.Println(err)
? return err
? }
? file.WriteString(htmlData)
? return nil
}
原文地址:https://www.cnblogs.com/MyUniverse/p/11470434.html
时间: 2024-10-08 14:51:11