如何根据文件分辨率和numericUpDown值创建多个目录?

时间:2014-05-13 15:04:37

标签: c# winforms

在这种情况下,每次更改numericUpDown值时,它都会创建一个新目录。 numericUpDoown设置为最小值10和最大值502。 在这种情况下,我使用的文件是512x512分辨率。

我想要做的是,如果例如numericUpdown设置为值10,我将点击确认按钮,它将创建许多目录,每个目录名称应如下所示:

SecondProcess_5132014-559-502x502

将创建的下一个目录将具有以下名称:

SecondProcess_5132014-549-492x492

下一个目录

SecondProcess_5132014-539-482x482

如果numericUpDown中的值现在为20,则第一个目录将为:

SecondProcess_5132014-559-492x492

然后

SecondProcess_5132014-559-472x472

所以我现在有了这段代码,但我想自动创建所有这些目录:

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            numeric = (int)numericUpDown1.Value;
            path = Path.Combine(@"c:\temp\newimages",
    String.Concat("SecondProcess_", DateTime.Now.ToString("MMddyyyy-HHmmss")));
                Directory.CreateDirectory(path);            
        }

        private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bgw = (BackgroundWorker)sender;
            if (bgw.CancellationPending == true)
            {
            }
            else
            {
                Image img;
                DirectoryInfo di1;
                FileInfo[] fi1;
                for (int i = 0; i < myGifList.Count; i++)
                {
                    Image image = Image.FromFile(myGifList[i]);
                    int imageWidth = image.Width;
                    int imageHeight = image.Height;
                    img = resizeImage(imageWidth - numeric, imageHeight - numeric, myGifList[i]);
                    img.Save(path + "\\" + Path.GetFileName(myGifList[i]), System.Drawing.Imaging.ImageFormat.Gif);
                }
                di1 = new DirectoryInfo(path);
                fi1 = di1.GetFiles("*.gif");
                List<string> newImages = new List<string>();
                for (int i = 0; i < fi1.Length; i++)
                {
                    newImages.Add(fi1[i].FullName);
                }
                unfreez.MakeGIF(newImages, path + "\\" + "animated.gif", 8, true);
            }
        }

        private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {

        }

        private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            pictureBoxImage(path + "\\" + "animated.gif");
            label10.Text = FileSize(path + "\\" + "animated.gif");
            label12.Text = ImageResolution(path + "\\" + "animated.gif");
            label7.Visible = true;
            label7.ForeColor = Color.Green;
            label7.Text = "Operation Have Been Completed";
            button1.Enabled = false;
            progressBar2.EndColor = Color.FromArgb(0, 211, 040);
            numericUpDown1.Enabled = true;
            button3.Enabled = true;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            numericUpDown1.Enabled = false;
            button3.Enabled = false;
            backgroundWorker2.RunWorkerAsync();
        }

它的作用是每次我更改numericUpDown值,如果它是10并且我点击按钮它将创建一个目录并放置所有图像和我创建的动画gif。 如果我将numericupdown值更改为20并单击该按钮,它将创建另一个包含图像和GIF动画的目录。

但我想要的是另外一个按钮如果我点击他并且vlaue是10这么自动它会根据文件分辨率和backgroundworker创建目录数。

我该怎么做?

修改

我尝试在此按钮点击事件中执行此操作:

private void button4_Click(object sender, EventArgs e)
        {
            Image img = Image.FromFile(previewFileName);
            int width = img.Width;
            int height = img.Height;
            int dirsnumbers = width / numeric;
            for (int i = 0; i < dirsnumbers; i++)
            {
                path = Path.Combine(@"c:\temp\newimages",
        String.Concat("SecondProcess_", DateTime.Now.ToString("MMddyyyy-HHmmss")) + 
                     "-" + "Width = " + (width - numeric) + " Height = " + (height - numeric) );
                Directory.CreateDirectory(path);
            }
        }

在此示例中,numeric = 10 和宽度= 512 所以它应该创建51个目录,但它只创建了一个目录。

另一个问题是512/10 = 51.2我无法创建51.2目录,所以如何检查51.2或51.3或51.9是否只能创建51个目录?

编辑**

private void button4_Click(object sender, EventArgs e)
        {
            Image img = Image.FromFile(previewFileName);
            int width = img.Width;
            int height = img.Height;
            double res = width / numeric;
            int dirsnumbers = (int)Math.Floor(res);
            for (int i = 0; i <= dirsnumbers; i++)
            {
                width = width - numeric;
                height = height - numeric;
                path = Path.Combine(@"c:\temp\newimages",
        String.Concat("SecondProcess_", DateTime.Now.ToString("MMddyyyy-HHmmss")) +
                     "-" + "Width = " + (width - numeric) + " Height = " + (height - numeric));
                if (width > 0 && height > 0)
                {
                    Directory.CreateDirectory(path);
                }
            }
        }

我所做的是在循环中添加了这两行:

width = width - numeric;
height = height - numeric;

但由于某种原因,我不明白为什么所有创建的目录都可以,但只有一个是奇怪的:

SecondProcess_05132014-193441-Width = -8 Height = -8

我无法弄清楚这减去8的来源。它们位于另外两个目录之间:

SecondProcess_05132014-193441-Width = 2 Height = 2 and SecondProcess_05132014-193441-Width = 12 Height = 12

也许这个-8有这条线的东西:

int dirsnumbers = (int)Math.Floor(res);

使用Math.Floor?

2 个答案:

答案 0 :(得分:1)

从你问题的最后两行开始 -

  

另一个问题是512/10 = 51.2我无法创建51.2目录   那么我如何检查是否是51.2或51.3或51.9告诉它创建   只有51个目录?

为此你必须使用 - Math.Floor()

我发现其余部分是正确的,所以现在您的代码看起来像这样 - 您也可以在Dotnet Fiddle中查看它。

private void button4_Click(object sender, EventArgs e)
{
            Image img = Image.FromFile(previewFileName);
            int width = img.Width;
            int height = img.Height;
            double res = width / numeric;
            int dirsnumbers = (int)Math.Floor(res);
            for (int i = 0; i <= dirsnumbers; i++)
        {
            path = Path.Combine(@"c:\temp\newimages",
            String.Concat("SecondProcess_", DateTime.Now.ToString("MMddyyyy-HHmmss")) +
                 "-" + "Width = " + (width - numeric) + " Height = " + (height - numeric));
            if (width > 0 && height > 0)
            {
                Directory.CreateDirectory(path);
            }

            width = width - numeric;
            height = height - numeric;
        }
}

答案 1 :(得分:-2)

在另一个线程(后台工作者)中使用具有相应名称的格式化字符串循环遍历mkdir。

mkdir("./some/path/string");

您可以访问文件解析,因此您可以对该信息进行正则表达式,并从中创建一个int。从那里你可以找到两个分辨率中的最大值。然后遍历最大值并减少两者,创建一个新目录。