发新话题
打印

[原创]自己玩下载

[原创]自己玩下载

  文章作者:风泽[E.S.T]
信息来源:邪恶八进制 中国

由于这个文章太简单太简单,偶都不好意思发了。
但看着最近么什么原创的东西,所以就拿出来充充数了。
别打我,我会伤心的。
参考了WINSHELL的部分代码,本来想突破防火墙的,因为技术原因没能继续写下去,现在想到一种方法,但又没时间写了。唉~~~

                             自己玩下载
                                     ----风泽[E.S.T]
    现在互连网上的资源是应有尽有,把这些软件下载到自己的计算机上慢慢查看是每个网虫每天必须做的一件事。相应的也就出现了很多功能丰富的下载软件,但您有没有自己想过自己写一个下载程序?LET'S GO!今天我就带大家来实现一个功能非常简单的下载程序。

开发环境:WINDOWS 2000  + VC++6.0
使用语言:C
实现功能:下载网络资源

    首先我们要建立一个文件夹来存放下载的软件,利用Directory();就可以轻松实现。代码如下:
int Directory()
{
//建立目录,如果成功返回1,不成功返回0
     int D;
        D=CreateDirectory("c:\\mydownload",NULL);
          return D;
}

    当文件夹存在时,函数将什么也不做,达到文件夹不存在时建立文件夹的目的。
    我们利用URLDownloadToFile();这个函数来实现下载,我们来简单的看一下这个函数的简单介绍:
    URLDownloadToFile函数原型:
    HRESULT URLDownloadToFile(      
                      LPUNKNOWN pCaller,
                      LPCTSTR szURL,
                      LPCTSTR szFileName,
                      DWORD dwReserved,
                      LPBINDSTATUSCALLBACK lpfnCB
                    );
    这个API是在URLMON.DLL文件中的一个导出函数,简单的实现了把一个文件从WEB服务器下载本机的功能,其实用这个函数还可以帮我们处理了断点续传,缓存等等的功能。

URLDownloadToFile的五个参数:

第一个 一般为NULL。
第二个 参数就是要下载文件的目标URL,完整路径。
第三个 是本地保存路径,也是完整路径。
第四个 是保留,必须为0。
第五个 是指向一个IBindStatusCallback接口的指针,这就类似一种回调机制,你可以参考这些来活动当前下载进度,选择是否继续下载等等.

    在这个简单的程序我们只关心第二和第三个参数,其他的通通设置成0。具体代码如下:
int downfile(char *downurl)  
{
     //下载文件保存到c:\mydownload目录下。
    HRESULT h;
    char *filename;            
    char *tk;              
    char url[MAX_PATH];         
    char path[MAX_PATH];         
    char st[]="/";
    int  reslut=0;         

      strcpy (url,downurl);            //将下载路径拷贝到URL中  
    tk=strtok(url,st);                // 获取下载路径中的文件名

    while(tk!=NULL)
        {
          filename=tk;     
          tk=strtok(NULL,st);  
        }

      strcpy(path,"c:\\mydownload\\");     //将"c:\\mydownload\\"拷贝到PATH中  
    strcat(path,filename);              //连接字符串,得到完整保存路径      
     
      if(file(path))                //调用判断文件名是否重名函数
      {
           printf("连接中……\n");
       h= URLDownloadToFile(0,downurl,path,0,0);  //下载文件
     if(h==S_OK)                        //判断是否下载完成            
       {  
            printf("文件下载成功!\n");
        printf("文件保存路径:%s\n",path);
        return reslut;                  //函数返回0
       }
         else
          {
          reslut=1;
           return reslut;            //函数返回1
          }

       }
      else
          {
        exit(0);
          }
}

    根据函数返回值我们来进行判断:
         i=downfile(u);
         if(i==0)
          {
            printf("谢谢使用。\n");
          }
            else
              {
              printf("\n未找到下载文件,请检查下载地址是否正确\n");
              }


    程序写到这里功能基本已经实现了,但还有一个文件名重名的问题需要我们处理一下,所以我就写了一个简单的函数来实现判断,代码如下:
int file(char *pathname)
{
  //检查下载文件和保存目录中的文件时候有重复。如果有则询问是否删除。

      int ret=1;
      char input;
      FILE *HI;

    if ((HI=fopen(pathname, "r")) == NULL)        //打开指定路径的文件
      {                              //函数返回1
      return ret;
      }
      else
        {
      printf("发现重名文件,选择是否删除(Y/N):");
          fclose(HI);
          input=getche();               //等待输入
          printf("\n");

               if(input=='y' ||input=='Y')  //对输入进行判断
               {                   //删除文件,返回1
                    
                if(DeleteFile(pathname))  
                  //调用删除文件的API函数 DeleteFile();
                    {
                        return ret;
                    }
                     else
                     {
                          GetLastError();   //返回错误信息
                     }
               }
               else
               {                  //函数返回0
                       ret=0;
                       return ret;
               }
      
      }
      
   return ret;
}

    好了,简单的下载软件就基本实现了,现在用VC++编译一下运行看看,我们已经可以从空间上下载程序了,虽然这个软件的功能远远差于流行的下载软件,但毕竟是自己亲手写出来的,用起来感觉就是不同啊. :P
http://hi.baidu.com/fengze

TOP

风泽前段时间忙工作 能有空写个文章真是难为他了:)
加油呀EvilH5u

TOP

我哭~~真感动~~~

我的名字一下子被改了2个~~晕~

风泽:风贼  (这个@!#$@%$#@%)
EvilHsu:EvilH5u (这个我喜欢)
http://hi.baidu.com/fengze

TOP

  用c#写个简单的下载程序
复制内容到剪贴板
代码:
using System;
using System.Net;


namespace download
{
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class Class1
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            try
            {
                string myStringWebResource = null;
                WebClient myWebClient = new WebClient();
                myStringWebResource = args[0]+args[1];
                Console.WriteLine("Downloading File \"{0}\" from \"{1}\" .......\n", args[1], myStringWebResource);
                myWebClient.DownloadFile(myStringWebResource,args[1]);      
                Console.WriteLine("Successfully Downloaded File \"{0}\" from \"{1}\"", args[1], myStringWebResource);
            }
            catch(Exception e)
            {
                Console.WriteLine("usage:download.exe <远程路径> <文件名>");
                Console.WriteLine("example:download.exe [url]http://lib.ncut.edu.cn/[/url] cat.jpg");

            }


        
        }
    }
}
我用青春赌明天

TOP

恶猫看来比我牛多了,C++和C#都会啊!HOHO`~~~牛人啊
http://hi.baidu.com/fengze

TOP

  那里呀,风泽兄,我是现学现卖,我前一阵子,想了解一下.net平台,我总觉的.net的概念我很模糊,所以看了看c#,现在的学习还是以c为主
我用青春赌明天

TOP

发新话题