I have array name files containing files names from the hard disk. There are 41 files in the array. The problem is in a trackBar ValueChanged event when I'm moving the slider of the trackBar to the bottom to 0 then value is -1 and it's throwing the exception beacuse I'm doing value - 1
pictureBox1.Image = Image.FromFile(files[(int)value - 1]);
and if I'm not making - 1 then it will throw the same exception when I'm moving the trackBar slider up to the last value 40.
there are 41 items in the array from 0 to 40.
this is the code.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ProgressBar;
using System.Xml;
using HtmlAgilityPack;
using System.Security.Policy;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;
namespace Download_Multi_Files
{
public partial class Form1 : Form
{
private Dictionary<string, string> linksandtime = new();
private List<string> links = new List<string>();
private List<Image> images = new List<Image>();
private string htmlCode = "";
private string result = "";
private string[] files;
public Form1()
{
InitializeComponent();
textProgressBar1.DisplayStyle = ProgressBarDisplayText.CustomText;
textProgressBar1.CustomText = "0";
GetLinks();
macTrackBar1.Value = 0;
GetImages();
}
private void GetLinks()
{
using (WebClient client = new WebClient()) // WebClient class inherits IDisposable
{
htmlCode = client.DownloadString("somesitehere");
}
var linkParser = new Regex(@"\b(?:?://|\.)\S+\b", RegexOptions.Compiled | RegexOptions.IgnoreCase);
var rawString = htmlCode;
foreach (Match m in linkParser.Matches(rawString))
{
if (m.Value.EndsWith("png"))
{
if (!linksandtime.ContainsValue(m.Value))
{
int index = m.Value.LastIndexOf("/");
int index1 = m.Value.LastIndexOf(".png");
if (index1 != -1)
{
result = m.Value.Substring(index + 1, index1 - index - 1);
}
if (!linksandtime.ContainsKey(result))
{
linksandtime.Add(result, m.Value);
links.Add(m.Value);
}
}
}
}
}
private async Task Download()
{
Stopwatch sw = new Stopwatch();
for (int i = 0; i < links.Count; i++)
{
using (WebClient webClientTemp = new WebClient())
{
webClientTemp.Proxy = null;
webClientTemp.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0 Chrome");
webClientTemp.DownloadFileCompleted += new AsyncCompletedEventHandler(((sender, e) => WebClientTemp_DownloadFileCompleted(sender, e, sw, i)));
webClientTemp.DownloadProgressChanged += new DownloadProgressChangedEventHandler((sender, e) => ProgressChangedTemp(sender, e, sw));
Uri URL = new Uri(links[i]);
sw.Start();
await webClientTemp.DownloadFileTaskAsync(URL, @"d:\testfiles\" + i.ToString() + ".png");
}
}
}
private void ProgressChangedTemp(object sender, DownloadProgressChangedEventArgs e, Stopwatch sw)
{
string downloadProgress = e.ProgressPercentage + "%";
string downloadSpeed = string.Format("{0} MB/s", (e.BytesReceived / 1024.0 / 1024.0 / sw.Elapsed.TotalSeconds).ToString("0.00"));
string downloadedMBs = Math.Round(e.BytesReceived / 1024.0 / 1024.0, 3) + " MB";
string totalMBs = Math.Round(e.TotalBytesToReceive / 1024.0 / 1024.0, 3) + " MB";
// Format progress string
string progress = $"{downloadedMBs}/{totalMBs} ({downloadProgress}) @ {downloadSpeed}"; // 10 MB / 100 MB (10%) @ 1.23 MB/s
lblDownloadProgress.Text = progress;
textProgressBar1.Value = e.ProgressPercentage;
textProgressBar1.CustomText = progress;
}
private void WebClientTemp_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e, Stopwatch sw, int i)
{
if (e.Error == null)
{
sw.Stop();
if (i == links.Count - 1)
{
GetImages();
}
}
else
{
string t = e.Error.Message;
}
}
private void GetImages()
{
files = Directory.GetFiles(@"d:\testfiles");
Array.Sort(files, new MyComparer());
macTrackBar1.Maximum = files.Length;
if (files.Length > 1)
{
macTrackBar1.Enabled = true;
pictureBox1.Image = Image.FromFile(files[macTrackBar1.Value]);
//timer1.Enabled = true;
}
else
{
macTrackBar1.Enabled = false;
timer1.Enabled = false;
}
}
private class MyComparer : IComparer<string>
{
[DllImport("Shlwapi.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern int StrCmpLogicalW(string psz1, string psz2);
public int Compare(string psz1, string psz2)
{
return StrCmpLogicalW(psz1, psz2);
}
}
private System.Drawing.Image ConvertByteArrayToImage(byte[] byteArrayIn)
{
using (var ms = new MemoryStream(byteArrayIn))
{
return System.Drawing.Image.FromStream(ms);
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private async void btnStart_Click(object sender, EventArgs e)
{
await Download();
}
int counter = 0;
private void timer1_Tick(object sender, EventArgs e)
{
if (counter == links.Count - 1)
{
counter = 0;
}
pictureBox1.Image = Image.FromFile(files[counter]);
counter++;
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
DrawRectangle(e, pictureBox1, 3, Color.Red);
}
public void DrawRectangle(PaintEventArgs PaintEventArgs, PictureBox Pb, int PenWidth, Color color)
{
Pen myPen = new Pen(color, (int)PenWidth);
PaintEventArgs.Graphics.DrawRectangle(myPen, 0, 0, Pb.Width - 1, Pb.Height - 1);
PaintEventArgs.Graphics.DrawLine(myPen, 0, 0, Pb.Width, 0);
PaintEventArgs.Graphics.DrawLine(myPen, 0, Pb.Height, Pb.Width, Pb.Height);
PaintEventArgs.Graphics.DrawLine(myPen, 0, 0, 0, Pb.Height);
PaintEventArgs.Graphics.DrawLine(myPen, Pb.Width, 0, Pb.Width, Pb.Height);
}
private void macTrackBar1_ValueChanged(object sender, decimal value)
{
pictureBox1.Image = Image.FromFile(files[(int)value]);
}
}
}
I'm setting the trackBar Maximum value in the GetImages() method. I tried there also to make files.Length - 1 or without - 1 but same behaviour as before.
I tried in the ValueChanged event to add a check , to check if value is not 0 because then value - 1 will make it -1
but then it will not display the image file at index 0 in the files array.