如何为其代码所属的每个名称创建一个目录?

时间:2017-01-26 16:13:54

标签: c# .net winforms

我正在从链接下载文件,到目前为止我已将它们保存在一个目录中。 但现在我需要将每组文件下载到特定目录。

这是我作为现有项目添加到项目中的第一个文本文件的内容。国家名称。

Europe
Alps
Benelux
Germany
Spain & Portugal
France
Greece
Italy
Poland
Scandinavia
Turkey
UK & Ireland
Russia
Baltic
Balkan
Romania & Bulgaria
Hungary
Africa
Algeria
Cameroon
CanaryIslands
Congo
CentralAfrica
Nigeria
Chad
Egypt
Ethiopia
Israel
Libya
Madagascar
Morocco
Namibia
SaudiArabia
Somalia
SouthAfrica
Sudan
Tanzania
Tunesia
WestAfrica
Zambia

我有另一个文本文件,显示每个国家/地区代码:

eu
alps
nl
de
sp
fr
gr
it
pl
scan
tu
gb
ru
bc
ba
se
hu
af
dz
cm
ce
cg
caf
ng
td
eg
et
is
ly
mg
mo
bw
sa
so
za
sd
tz
tn
wa
zm

为什么代码很重要?因为每个链接都是使用国家代码而不是名称构建的。例如:

http://www.sat24.com/image2.ashx?region=is&time=201612271600&ir=true

所以我知道在链接中部分区域=意味着在这种情况下国家代码是:'是'(以色列)。

所以现在我需要找到所有代码'是'的链接应该下载到以色列目录。

接下来,链接将与其他区域相关联,例如:

http://www.sat24.com/image2.ashx?region=tu&time=201612271600&ir=true

所以现在代码tu是针对国家土耳其所以现在每个链接代码都应该下载到土耳其目录。

所以第一个问题是如何在国家/地区名称的链接中连接国家/地区的代码,然后将其下载到我已经在构造函数中创建的正确的国家/地区名称目录中?我已经准备好所有国家/地区的名称目录,但我需要以某种方式连接到国家/地区名称目录的链接中的代码(区域)。

第二个问题是我每15分钟进行一次下载。我稍后会用计时器做。每15分钟再次下载图像。但我不想删除或覆盖旧图像,主要思想是保存和保存图像。问题是每个国家每15分钟应创建哪些子路径?我是指每15分钟给每个国家子路径命名的名字?

我想为每个国家创建一个目录,其中包含下载图像的日期和时间范围,但我不确定这是不是一个好主意。

稍后我希望能够在每个国家/地区的这些目录之间移动,并且它会将图像加载到pictureBox。问题是我将如何识别每15分钟下载的每个目录?

问题不在于下载程序正在运行。 这两个问题与目录有关。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;

namespace Downloader
{
    public partial class Form1 : Form
    {
        int countCompleted = 0;
        ExtractImages ei = new ExtractImages();

        List<string> newList = new List<string>();
        List<string> countryList = new List<string>();
        List<string> countriesPaths = new List<string>();

        private Queue<string> _downloadUrls = new Queue<string>();

        public Form1()
        {
            InitializeComponent();

            ManageDirectories();

            lblDownloads.Text = "0";
            ei.Init();
            foreach (ExtractImages.Continent continent in ei.world.continents)
            {
                foreach (ExtractImages.Country country in continent.countries)
                {
                    if (country.name == "Israel")
                    {
                        foreach (string imageUri in country.imageUrls)
                        {
                            countryList.Add(imageUri);
                        }
                    }
                    else
                    {
                        foreach (string imageUri in country.imageUrls)
                        {
                            newList.Add(imageUri);
                        }
                    }
                }
            }
        }

        private void ManageDirectories()
        {
            string savedImagesPath = Path.GetDirectoryName(Application.LocalUserAppDataPath);
            string mainPath = "Countries";
            mainPath = Path.Combine(savedImagesPath, mainPath);
            string[] lines = File.ReadAllLines("CountriesNames.txt");
            foreach(string path in lines)
            {
                string countryPath = Path.Combine(mainPath, path);
                if (!Directory.Exists(countryPath))
                {
                    Directory.CreateDirectory(countryPath);
                }
                countriesPaths.Add(countryPath);
            }
            string[] countriesCodes = File.ReadAllLines("CountriesCodes.txt");
        }

        private void downloadFile(IEnumerable<string> urls)
        {
            foreach (var url in urls)
            {
                _downloadUrls.Enqueue(url);
            }

            // Starts the download
            btnStart.Text = "Downloading...";
            btnStart.Enabled = false;
            pbStatus.Visible = true;

            DownloadFile();
        }

        int count = 0;
        private void DownloadFile()
        {
            if (_downloadUrls.Any())
            {
                WebClient client = new WebClient();
                client.DownloadProgressChanged += client_DownloadProgressChanged;
                client.DownloadFileCompleted += client_DownloadFileCompleted;

                var url = _downloadUrls.Dequeue();
                //string FileName = url.Substring(url.LastIndexOf("/") + 1,
                //          (url.Length - url.LastIndexOf("/") - 1));


                client.DownloadFileAsync(new Uri(url), countriesPaths[count] + ".gif");
                RichTextBoxExtensions.AppendText(richTextBox1, "Downloading: ", Color.Red);
                RichTextBoxExtensions.AppendText(richTextBox1, url, Color.Green);
                richTextBox1.AppendText(Environment.NewLine);
                count++;
                return;
            }

            // End of the download
            btnStart.Text = "Download Complete";
            countCompleted = newList.Count;
            lblDownloads.Text = countCompleted.ToString();
            timer1.Enabled = true;
            downloadFile(newList);
        }

        private void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                RichTextBoxExtensions.UpdateText(richTextBox1, "Downloading: ", "Downloaded: ", Color.Red);
                // handle error scenario
                throw e.Error;
            }
            else
            {
                countCompleted--;
                lblDownloads.Text = countCompleted.ToString();
                RichTextBoxExtensions.UpdateText(richTextBox1, "Downloading: ", "Downloaded: ", Color.Green);
            }
            if (e.Cancelled)
            {
                // handle cancelled scenario
            }
            DownloadFile();
        }

        void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            double bytesIn = double.Parse(e.BytesReceived.ToString());
            double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
            double percentage = bytesIn / totalBytes * 100;
            pbStatus.Value = int.Parse(Math.Truncate(percentage).ToString());
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            countCompleted = countryList.Count;
            lblDownloads.Text = countCompleted.ToString();
            downloadFile(countryList);
        }

        public class RichTextBoxExtensions
        {
            public static void AppendText(RichTextBox box, string text, Color color)
            {
                box.SelectionStart = box.TextLength;
                box.SelectionLength = 0;

                box.SelectionColor = color;
                box.AppendText(text);
                box.SelectionColor = box.ForeColor;
            }
            public static void UpdateText(RichTextBox box, string find, string replace, Color? color)
            {
                box.SelectionStart = box.Find(find, RichTextBoxFinds.Reverse);
                box.SelectionLength = find.Length;
                box.SelectionColor = color ?? box.SelectionColor;
                box.SelectedText = replace;
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {

        }

        private void SortList()
        {

        }
    }
}

2 个答案:

答案 0 :(得分:0)

只需使用通用字典将国家/地区代码绑定到目录路径中使用的全名

Dictionary<string, string> countryCodeMapping = new Dictionary<string, string>() {
   {"us", "United States"},
   {"is", "Isreal"}
   ...
};

答案 1 :(得分:0)

如果两个文件按照示例中的顺序排序,您可以创建字典表单代码以反过来命名。

var codes = new List<string>() { ..... }
var countries = new List<string> () { ....}

创建字典将如下所示

var codeToFullNameMap = codes
.Select((code, index) => index)
.ToDictionary(
    keySelector: index => codes[index].
    elementSelector: index => cointires[index]);

然后创建字典,您可以通过其代码访问完整的国家/地区名称。

var countryName = codeToFullNameMap["tu"];

关于第二个问题。如果命名为您提供了足够的信息,并且使用了它认为的当前日期时间,那么它应该是正确的。

我的建议是为每个下载开始时间创建国家/地区代码和子文件夹的目录(包括小时,分钟和秒数就足够了)。

TU // (main folder)
  -> 2017-01-26-18-50-10 // (subfolder 1)
      -> img#1
      -> img#2
  -> 2017-01-26-18-50-10 // (subfolder 2)

我不确定第三个问题。如果您的文件夹名为TU,这足以说明图像是针对土耳其的,还是我错过了什么?每个子文件夹包含从最后一个文件开始15分钟后下载的图像。

也许如果你分享关于第三个问题的更多细节,你究竟在哪里看到问题,例如你需要在各个国家的桌面应用程序中可视化图像?