C# Code Snippets

TinyUrl Updater

Max Black

Allows a programmer to add simple update abilities to his/her stand alone applications. Basically you check tinyurl for updates to your program. When you want to update your program simply post up a link to tinyurl, the link is to your newer version (hosted anywhere), and change the alias to the alias you specified in the app, then add the "version". Example: My alias is 'asdflhedafAppa', and the current version out is 3. So to update, I upload the newest version to anywhere I can find, and post to tinyurl the download link, with an alias of 'asdflhedafAppa4'.

NOTE: This has no hash check, and was meant for novelty, not production grade updates.

Platform: .NET Framework 2.0

    //This class was created to add an easy way to update stand alone executable
    //It works by contacting the Tinyurl.com servers looking for a custom url of you choice,
    //if the url exists, this program downloads it, checks the hash, then replaces this with it.

    //You update by uploading the new exe somewhere (doesn't matter where), then adding that link to
    //tinyurl.com with the custom url you specified here

    //Thanks to VCSKicks.com for the download http article : http://www.vcskicks.com/download_file_http.php
    class TinyUrlUpdate
    {
        //PRIVATE PARAMS
        private string alias;
        /// <summary>
        /// Alias with version appended, what would be the real alias
        /// </summary>
        private string Ralias;
        private int Curversion;
        private string StartUpPath;

        private bool updateAvailableSet = false;
        private bool updateAvailable;

        //PUBLIC PARAMS
        /// <summary>
        /// Is there a new verison?
        /// </summary>
        public bool UpdateAvalibele
        {
            get
            {
                if (updateAvailableSet)
                    return updateAvailable;

                updateAvailableSet = true;
                if (TinyUrlExists(Ralias))
                {
                    updateAvailable = true;
                    return true;
                }
                else
                {
                    updateAvailable = false;
                    return false;
                }
            }
        }

        //CONSTRUCTORS
        /// <summary>
        /// Allows you to update this program through TinyUrl
        /// </summary>
        /// <param name="alias">tinyurl alias to check if exists</param>
        /// <param name="Curversion">Current Version</param>
        public TinyUrlUpdate(string alias, int Curversion)
        {
            this.alias = alias;
            this.Ralias = alias + (Curversion + 1).ToString();
            this.Curversion = Curversion;

            //For Win Apps
            // Enviroment.Getpath Something like that
            //Use this line if your running from console
            this.StartUpPath = Process.GetCurrentProcess().MainModule.FileName;
        }

        //PRIVATE METHODS
        /// <summary>
        /// Does the alias exist?
        /// </summary>
        /// <returns></returns>
        private bool TinyUrlExists(string alias)
        {
            try
            {
                var request = WebRequest.Create("http://tinyurl.com/" + alias);
                var res = request.GetResponse();
                string text;
                using (var reader = new StreamReader(res.GetResponseStream()))
                {
                    text = reader.ReadToEnd();
                }
                if (text.IndexOf("<h1>Error: Unable to find site's URL to redirect to.</h1>") != -1) 
                {
                    // URL doesn't exist
                    return false;
                }
                else
                {
                    return true;
                }
            }
            catch (Exception)
            {
                return false;
            }
        }
        /// <summary>
        /// Delete old file, rename file with .new to the old filename
        /// </summary>
        private void DeleteSelf()
        {

            string bf = "@echo off" + Environment.NewLine +
                        ":dele" + Environment.NewLine +
                        "del \"" + StartUpPath + "\"" + Environment.NewLine +
                        "if Exist \"" + StartUpPath + "\" GOTO dele" + Environment.NewLine +
                        "move \"" + StartUpPath + ".new\" \"" + StartUpPath + "\"" + Environment.NewLine +
                        "del %0";

            string filename = Path.GetRandomFileName() + ".bat";

            StreamWriter file = new StreamWriter(Environment.GetEnvironmentVariable("TMP") + filename);
            file.Write(bf);
            file.Close();

            Process proc = new Process();
            proc.StartInfo.FileName = Environment.GetEnvironmentVariable("TMP") + filename;
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            proc.StartInfo.UseShellExecute = true;

            proc.Start();
            proc.PriorityClass = ProcessPriorityClass.Normal;
        }
        /// <summary>
        /// Download file from url, then return as byte array
        /// </summary>
        /// <param name="url">Url to file to download</param>
        /// <returns>File in byte array</returns>
        private byte[] downloadData(string url)
        {
            try
            {
                //Get a data stream from the url
                WebRequest req = WebRequest.Create(url);
                WebResponse response = req.GetResponse();
                Stream stream = response.GetResponseStream();

                //Download in chuncks
                byte[] buffer = new byte[1024];

                //Get Total Size
                int dataLength = (int)response.ContentLength;

                //Download to memory
                //Note: adjust the streams here to download directly to the hard drive
                MemoryStream memStream = new MemoryStream();
                while (true)
                {
                    //Try to read the data
                    int bytesRead = stream.Read(buffer, 0, buffer.Length);

                    if (bytesRead == 0)
                    {
                        break;
                    }
                    else
                    {
                        //Write the downloaded data
                        memStream.Write(buffer, 0, bytesRead);
                    }
                }
                //Clean up
                stream.Close();
                memStream.Close();

                //Convert the downloaded stream to a byte array
                return memStream.ToArray();
            }
            catch (Exception)
            {
                //May not be connected to the internet
                //Or the URL might not exist
                Console.WriteLine("There was an error accessing the URL.");
                return null;
            }
        }

        //PUBLIC METHODS
        public void UpdateNow()
        {
            if (!UpdateAvalibele)
                return;
            //Download the new EXE
            byte[] EXE = downloadData("http://tinyurl.com/" + Ralias);
            if (EXE == null)
                return;

            FileStream newFile = new FileStream(StartUpPath + ".new", FileMode.Create);
            newFile.Write(EXE, 0, EXE.Length);
            newFile.Close();
            DeleteSelf();
        }

    }


//USAGE
TinyUrlUpdate update = new TinyUrlUpdate("adfl43lkhasdf", 1);
update.UpdateNow();

 

Back to C# Code Snippet List