循环中的OutOfMemoryException错误

时间:2013-11-15 06:21:13

标签: c# .net wpf list image-processing

我正在尝试创建一个将文件上传到FTP的Windows应用。本质上,它在给定文件夹中查找.jpeg文件,它在将.jpg上载到FTP服务器之前读取.jpg文件中的条形码,然后将URL输入数据库以获取我们的记录。

由于文件夹中任何给定时间都会有多个文件,我基本上是在循环中读取它们,并相应地处理它们。但是,每当循环再次启动时,我都会收到OutOfMemoryException。我想知道我在这里做错了什么。我在下面添加了我的代码:

private void btnProcess_Click(object sender, RoutedEventArgs e)
{
    podPath = Directory.GetFiles(DestPath, "*.jpg");
    List<string> scans = new List<string>(podPath.Length);
    List<string> badscans = new List<string>();
    byte[] imageBytes;
    string filename, result;
    POD conpod = new POD();
    OTPOD otpod = new OTPOD();
    ConsignmentObj scanJob;
    //Pickup OTScan;
    //Consolidate ccv;

    for (int i = 0; i < podPath.Count(); i++ )
    {
        filename = podPath[i].ToString();

        using (Bitmap bm = (Bitmap)Bitmap.FromFile(filename))
        {
            var results = barcodeReader.Decode(bm);
            result = results.ToString();
            bm.Dispose();
        }

        if (result != null)
        {
            //if barcode can be read, we throw the value into the database to pull out relevant information
            if (result.Contains(ConNotePrefix))
            {
                #region Consignments
                scanJob = getCon(result.ToString());
                final = ImageFolder + "\\" + result.ToString() + ".jpg";

                using (System.Drawing.Image img = System.Drawing.Image.FromFile(filename))
                {
                    MemoryStream ms = new MemoryStream();
                    try
                    {
                        img.Save(ms, ImageFormat.Jpeg);
                        imageBytes = ms.ToArray();
                        img.Dispose();
                    }
                    finally
                    {
                        ms.Flush();
                        ms.Close();
                        ms.Dispose();
                    } 
                }

                lock (filename)
                {
                    if (System.IO.File.Exists(filename))
                    {
                        File.Delete(filename);
                    }
                }

                using (var stream = File.Create(final)) { }
                File.WriteAllBytes(final, imageBytes);
                File.Delete(filename);

                conpod.ConsignmentID = scanJob.ConsignmentID;
                conpod.UserID = 1;
                conpod.Location = ftpUrl + "//" + result.ToString() + ".jpg";
                conpod.rowguid = Guid.NewGuid();

                UploadFilesToFtp(ftpUrl, ftpUser, ftpPass, final, result.ToString() + ".jpg");
                insertPOD(conpod);
                scans.Add(result.ToString());
                #endregion
                }
            }
            else
            {
                badscans.Add(filename);
            }
        }
    this.lbScans.ItemsSource = scans;
    this.lbBadScans.ItemsSource = badscans;
}

FTP方法UploadFilesToFtp(x,x,x,x,x,x)在这里不是问题。所有反馈将非常感谢。

1 个答案:

答案 0 :(得分:4)

OutOfMemoryException类的方法FromFile也可以抛出Image

  

该文件没有有效的图片格式。

     

     

GDI +不支持文件的像素格式。

所以我认为您正在阅读的某个图像文件存在问题。一种解决方案是捕获OutOfMemoryException并将文件添加到badscans

try{
  using (Bitmap bm = (Bitmap)Bitmap.FromFile(filename)) {
    var results = barcodeReader.Decode(bm);
    result = results.ToString();
    bm.Dispose();
  }
}
catch(OutOfMemoryException) {
  badscans.add(filename);
}