How to Build a Windows Download Manager Software [Code Included]

How to Build a Windows Download Manager Software [Code Included]

Category: Blog
Publication Date: February 9, 2025, Author: Admin, Network: i1apk

Creating a Download Manager Software for Windows involves building a desktop application that can handle file downloads, pause/resume functionality, multi-threaded downloads, and a user-friendly interface. Below is a step-by-step guide to creating a basic download manager using C# and .NET with Windows Forms for the UI.


1. Setup the Project

  1. Open Visual Studio.
  2. Create a new Windows Forms App (.NET Framework) project.
  3. Name the project (e.g., DownloadManager).

2. Design the UI

In the Form1.cs [Design] view, add the following controls:

  • TextBox for the download URL.
  • Button to start the download.
  • ProgressBar to show download progress.
  • Label to display download status.
  • ListBox to show download history.

Here’s the XML layout for the UI:

<?xml version="1.0" encoding="utf-8"?>
<Form xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="Download Manager" Height="400" Width="600">
    <Grid>
        <TextBox x:Name="txtUrl" HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" VerticalAlignment="Top" Width="400" />
        <Button x:Name="btnDownload" Content="Download" HorizontalAlignment="Left" Margin="420,10,0,0" VerticalAlignment="Top" Width="75" Click="btnDownload_Click" />
        <ProgressBar x:Name="progressBar" HorizontalAlignment="Left" Height="20" Margin="10,50,0,0" VerticalAlignment="Top" Width="560" />
        <Label x:Name="lblStatus" Content="Status: Idle" HorizontalAlignment="Left" Margin="10,80,0,0" VerticalAlignment="Top" />
        <ListBox x:Name="listDownloads" HorizontalAlignment="Left" Height="200" Margin="10,110,0,0" VerticalAlignment="Top" Width="560" />
    </Grid>
</Form>

Run HTML


3. Implement the Download Logic

In Form1.cs, add the following code to handle downloads:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Net;
using System.Windows.Forms;

namespace DownloadManager
{
    public partial class Form1 : Form
    {
        private WebClient webClient;
        private string downloadPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads");

        public Form1()
        {
            InitializeComponent();
            webClient = new WebClient();
            webClient.DownloadProgressChanged += WebClient_DownloadProgressChanged;
            webClient.DownloadFileCompleted += WebClient_DownloadFileCompleted;
        }

        private void btnDownload_Click(object sender, EventArgs e)
        {
            string url = txtUrl.Text;
            if (string.IsNullOrEmpty(url))
            {
                MessageBox.Show("Please enter a valid URL.");
                return;
            }

            string fileName = Path.GetFileName(url);
            string filePath = Path.Combine(downloadPath, fileName);

            if (File.Exists(filePath))
            {
                MessageBox.Show("File already exists.");
                return;
            }

            lblStatus.Text = "Downloading...";
            webClient.DownloadFileAsync(new Uri(url), filePath);
        }

        private void WebClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            progressBar.Value = e.ProgressPercentage;
        }

        private void WebClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                lblStatus.Text = "Error: " + e.Error.Message;
            }
            else
            {
                lblStatus.Text = "Download Complete!";
                listDownloads.Items.Add(Path.GetFileName(((Uri)webClient.QueryString["url"]).AbsolutePath));
            }
        }
    }
}

4. Add Pause/Resume Functionality

To add pause/resume functionality, you need to use HttpWebRequest and HttpWebResponse instead of WebClient. Here’s an example:

private long totalBytes;
private long downloadedBytes;
private bool isPaused;
private HttpWebRequest webRequest;
private Stream responseStream;
private FileStream fileStream;

private void StartDownload(string url, string filePath)
{
    webRequest = (HttpWebRequest)WebRequest.Create(url);
    webRequest.AddRange(downloadedBytes);
    webRequest.BeginGetResponse(ResponseCallback, null);
}

private void ResponseCallback(IAsyncResult result)
{
    var response = (HttpWebResponse)webRequest.EndGetResponse(result);
    totalBytes = response.ContentLength + downloadedBytes;
    responseStream = response.GetResponseStream();

    fileStream = new FileStream(filePath, FileMode.Append, FileAccess.Write);

    byte[] buffer = new byte[4096];
    int bytesRead;
    while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0 && !isPaused)
    {
        fileStream.Write(buffer, 0, bytesRead);
        downloadedBytes += bytesRead;
        UpdateProgress();
    }

    if (!isPaused)
    {
        lblStatus.Text = "Download Complete!";
    }
}

private void UpdateProgress()
{
    int progress = (int)((double)downloadedBytes / totalBytes * 100);
    progressBar.Invoke((MethodInvoker)(() => progressBar.Value = progress));
}

private void PauseDownload()
{
    isPaused = true;
    responseStream.Close();
    fileStream.Close();
}

private void ResumeDownload()
{
    isPaused = false;
    StartDownload(txtUrl.Text, Path.Combine(downloadPath, Path.GetFileName(txtUrl.Text)));
}

5. Add Multi-Threaded Downloads

To download files in chunks using multiple threads, you can split the file into parts and download each part simultaneously. Here’s a basic example:

private void DownloadChunk(string url, string filePath, long start, long end)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.AddRange(start, end);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    Stream stream = response.GetResponseStream();

    using (FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.Write))
    {
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
        {
            fileStream.Write(buffer, 0, bytesRead);
        }
    }
}

private void DownloadFileMultiThreaded(string url, string filePath, int numThreads)
{
    long fileSize = GetFileSize(url);
    long chunkSize = fileSize / numThreads;

    for (int i = 0; i < numThreads; i++)
    {
        long start = i * chunkSize;
        long end = (i == numThreads - 1) ? fileSize : start + chunkSize - 1;
        new Thread(() => DownloadChunk(url, filePath + ".part" + i, start, end)).Start();
    }
}

6. Build and Run

  1. Build the project in Visual Studio.
  2. Run the application.
  3. Enter a download URL and click “Download” to start the download.

7. Advanced Features

  • Download Queue: Add a queue system to handle multiple downloads.
  • Speed Limit: Implement bandwidth throttling.
  • File Integrity Check: Use checksums (e.g., MD5, SHA256) to verify downloaded files.
  • User Settings: Allow users to configure download paths, thread counts, etc.
  • Dark Mode: Add a modern UI with dark mode support.

This is a basic implementation. You can expand it with more advanced features like a browser extensioncloud integration, or download scheduling. Let me know if you need help with any specific feature! 

Rate This Post: