如果文件已经存在,则将文件名增加VB.NET到C#的转换

时间:2019-06-09 16:36:27

标签: c#

由于某些附加的图像分析功能和滤镜无法在VB.NET中使用,我目前正在将一些从VB.NET创建的软件重写为C#。如果尚不存在该程序的一部分,则该程序的一部分会自动创建一个新文件夹(工作正常),然后在增加文件名的同时开始将存储在相机图像缓冲区中的图像保存到文件中。我不确定我在尝试从VB.NET转换时是否在使用正确的方法。

        private void tmAutoCap_Tick(object sender, EventArgs e)
    {


        if (dAltitudeAngle < Convert.ToDouble(tbSolarAltSet.Text) & cbDarkSubAC.Checked == true)
        {

            try
            {
                ImageBuffer ImgBuffer = default(ImageBuffer);
                int x = 0;
                int y = 0;
                int BytesPerLine = 0;
                Cursor = Cursors.WaitCursor;


                int i = 0;
                string FileMask = (Global_Variables.NewDirectory + "\\AutoCap_{0}.bmp");
                string Filename = "";
                Filename = string.Format(FileMask, i);

                while (System.IO.File.Exists(Filename))
                {
                    i += 1;
                    Filename = string.Format(FileMask, i);
                }

                Bitmap Dark = Image.FromFile(tbDarkRoot.Text, true) as Bitmap;
                ImgBuffer = IcImagingControl1.ImageBuffers[1];
                // Calculate the count of bytes ber line using the color format and the
                // pixels per line of the image buffer.
                BytesPerLine = (ImgBuffer.BitsPerPixel / 8) * ImgBuffer.PixelPerLine - 1;
                for (y = 0; y <= ImgBuffer.Lines - 1; y++)
                {
                    for (x = 0; x <= BytesPerLine; x++)
                    {
                        if (Dark.GetPixel(x, y).R <= ImgBuffer[x, y])
                        {
                            ImgBuffer[x, y] = Convert.ToByte(ImgBuffer[x, y] - Dark.GetPixel(x, y).R);
                        }
                        else
                        {
                            ImgBuffer[x, y] = 0;
                        }
                    }
                }

                ImgBuffer.SaveAsBitmap(Filename);

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.StackTrace);
                System.IO.File.AppendAllText(Application.UserAppDataPath + "\\SkyCamErrorLog.txt", string.Format("{0}{1}{2}{3}", Environment.NewLine, DateTime.Now.ToString(), Environment.NewLine, ex.ToString()));

            }

我曾希望它可以查找文件,如果找到了文件,则可以通过使用文件掩码从现有的最高文件中自动增加,但是它始终无法创建任何文件,并且抛出的错误消息是:

TIS.Imaging.ICException: Unknown error occurred Base Library Error : Permission denied
at TIS.Imaging.ImageBuffer.SaveImage(String filename)
at TIS.Imaging.ImageBuffer.SaveAsBitmap(String filename)
at Sky_Cam_Version_2.SkyCamForm.tmAutoCap_Tick(Object sender, EventArgs e)

基于这个原因,我认为我尝试创建文件名的方式出了问题。

1 个答案:

答案 0 :(得分:0)

因此,问题出在这里的代码并不多,实际上是在做正确的事情。问题出在代码中我定义“ NewDirectory”的其他地方,我的代码简单地为

var NewDirectory = (tbSaveFilesLocation.Text + "\\" + NewFolder);

我现在应该拥有的东西实际上已经定义了全局变量,因此我可以从其他地方调用它。

Global_Variables.NewDirectory = (tbSaveFilesLocation.Text + "\\" + NewFolder);

由于基于计时器创建目录,因此将其设置为全局变量。计时器打勾时,它会查看目录是否存在当前日期/时间,如果不存在,则会创建一个新文件夹,然后该目录将成为所有新图像应保存到的文件夹。

调试器向我显示了答案,我只是看不到答案,因为我非常关注“ \ AutoCap_ {0} .bmp”的输出,该输出返回了正确的结果,我忘记了它应该具有因此,在它前面的Global_Variables.NewDirectory的结果中,它试图写入名称正确但未引用任何目录的文件。