从C#中的http路径下载给定类型(.dll)的所有文件

时间:2015-10-28 11:07:45

标签: c# dll reference

之前有人问过类似的问题。但我找不到合适的解决方案了。 我有一个使用用户定义的DLL库(Cplus_Function_Library.dll)的应用程序。想象一下,该应用程序已经向客户推出。如果有新版本的dll可用,应用程序将自动下载并替换旧版本。那里没问题。

现在我想创建新的dll库(很多)并将其上传到Cplus_Function_Library.dll新版本存在的同一个地方(例如:http路径/ FTP服务器)。然后我可以在Cplus_Function_Library.dll中通过引用添加它们。它也很清楚。 但我的问题是如何在这个路径中下载所有dll文件而不在我的updater函数中逐个给出文件名?因为当我启动应用程序时这些文件是未知的。(更新程序功能)包含在应用程序中。)是否有一种简单的方法从指定的路径下载所有的dll文件没有太多的麻烦?

我目前的更新功能如下所示。

    Uri pathToNewVerNo = new Uri("//....../New_version.txt"); //Path to the new version number
    Uri pathToCurrentVerNo = new Uri("...../Current_version.txt"); //Path to the current version number
    Uri pathToDownload = new Uri(".....new_library.dll");
    StreamReader readNewVer; //To read the new version number
    StreamReader readCurVer; //To read the current version number
    StreamWriter writeToCurVer;
    WebClient verNew = new WebClient(); //will be used to download the New_version .txt file
    WebClient verCur = new WebClient(); //will be used to download the Current_version .txt file
    WebClient update = new WebClient(); //will be used to download the new dll file
    verNew.DownloadFile(pathToNewVerNo, "New_version.txt"); //Download the New_version .txt file
    readCurVer = new StreamReader("Current_version.txt"); //open Current_version.txt file to read
    current_Version = readCurVer.ReadLine(); //assign the value to a string
    readCurVer.Close(); //close the file 
    readNewVer = new StreamReader("New_version.txt"); //open New_version.txt file to read  
    new_Version = readNewVer.ReadLine(); //assign the value to a string
    readNewVer.Close(); //close the file
    current_ver_doub = Convert.ToDouble(current_Version); //convert the string value to a double
    new_ver_doub = Convert.ToDouble(new_Version);

    if (new_ver_doub > current_ver_doub) //check if the new version number is greater than the current version number
    {
        obj.SBO_Application.StatusBar.SetText("Please wait update in process", BoMessageTime.bmt_Medium, BoStatusBarMessageType.smt_Warning);
        writeToCurVer = new StreamWriter("Current_version.txt"); //open the current_version.txt to write
        writeToCurVer.Write(new_Version); //update with new version number
        writeToCurVer.Close(); //close the file
        update.DownloadFile(pathToDownload, "new_library.dll"); //download the new .dll file



        //*************There will be a roll back functionality added in the future in case if the updated dll file is currupted.*****************
        File.Replace("new_library.dll", "Cplus_Function_Library.dll", "Cplus_Function_Library.dll.bac", false); //make a back up file of the old .dll file and replace it

        obj.SBO_Application.MessageBox("Update Successful. Please restart the AddOn", 1, "Ok");

        try
        {
            foreach (Process proc in Process.GetProcessesByName("cplus_Global"))
            {
                proc.Kill();
                proc.WaitForExit();
            }
        }
        catch (Exception ex)
        {
            obj.SBO_Application.MessageBox(ex.Message, 1, "Ok");
        } 



    }
    else
    {
        //  SBO_Application.MessageBox("No Update Available", 1, "Ok");
    }

}//End of updater_cplus function   */

2 个答案:

答案 0 :(得分:0)

首先,您需要问自己是否绝对想要重新发明轮子,并准备好解决在执行此操作时遇到的所有问题,例如您现在遇到的问题。有许多现有的解决方案可以将安装程序和更新程序包含在您的软件中。

无论如何,要回答你的问题:

  

如何在此路径中下载所有dll文件,而不是在更新程序功能中逐个提供文件名?

你随便提一下它应该适用于HTTP和FTP。前者没有正式的“目录列表”命令,所以你必须自己发明。后者确实如此,但要求目录只包含相关文件,或者您需要创建白名单和/或黑名单以包含或排除某些文件。

最简单的解决方案是定义您的版本文件格式,以便包含要下载的文件列表。然后,您获取版本文件,解释它并请求其中提到的文件。

答案 1 :(得分:0)

根据CodeCaster的想法,我将所有的dll文件放在一个文件夹中,将new_version文本文件放在另一个文件夹中。通过这种方式,我确保不同的文件格式不会混淆。

下一步是从ftp服务器读取new_version.txt并将该值与当前版本进行比较。如果它大于后者,我将dll文件的所有文件名都列入列表。然后,您可以轻松地将文件逐个下载到您想要的位置。