Aquí es mi clase Picture.cs:Obtener un 'fuera de la memoria' excepción en este relativamente sencillo programa
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Drawing;
namespace SharpLibrary_MediaManager
{
public class Picture:BaseFile
{
public int Height { get; set; }
public int Width { get; set; }
public Image Thumbnail { get; set; }
/// <summary>
/// Sets file information of an image from a given image in the file path.
/// </summary>
/// <param name="filePath">File path of the image.</param>
public override void getFileInformation(string filePath)
{
FileInfo fileInformation = new FileInfo(filePath);
if (fileInformation.Exists)
{
Name = fileInformation.Name;
FileType = fileInformation.Extension;
Size = fileInformation.Length;
CreationDate = fileInformation.CreationTime;
ModificationDate = fileInformation.LastWriteTime;
Height = calculatePictureHeight(filePath);
Width = calculatePictureWidth(filePath);
}
}
public override void getThumbnail(string filePath)
{
Image image = Image.FromFile(filePath);
Thumbnail = image.GetThumbnailImage(40, 40, null, new IntPtr());
}
private int calculatePictureHeight(string filePath)
{
var image = Image.FromFile(filePath);
return image.Height;
}
private int calculatePictureWidth(string filePath)
{
var image = Image.FromFile(filePath);
return image.Width;
}
}
}
Y aquí, estoy usando esa clase para extraer información de cada archivo en una carpeta determinada:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace SharpLibrary_MediaManager
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string folderPath = @"D:\Images\PictureFolder";
private void button1_Click(object sender, EventArgs e)
{
DirectoryInfo folder = new DirectoryInfo(folderPath);
List<Picture> lol = new List<Picture>();
foreach (FileInfo x in folder.GetFiles())
{
Picture picture = new Picture();
picture.getFileInformation(x.FullName);
lol.Add(picture);
}
MessageBox.Show(lol[0].Name);
}
}
}
Recibo una excepción de falta de memoria y realmente no sé por qué. Esta es la primera vez que hago algo así, por lo que soy bastante nuevo en el procesamiento de archivos por lotes, etc.
¿Alguna ayuda, chicos? :)
Editar: me abrió el Administrador de tareas para ver el uso de memoria y cuando se presiona el botón para ejecutar el método noto mis aumenta el uso de memoria de 100 MB ~ cada segundo.
Editar 2: En mi carpeta tengo alrededor de 103 imágenes, cada imagen es ~ 100kb. Necesito una solución donde no importa cuántas imágenes hay en una carpeta. Alguien me recomendó abrir una imagen, hacer mi magia y luego cerrarla. Realmente no entiendo lo que él quiso decir con "cerca".
¿Alguien puede recomendar un enfoque diferente? :)
Datos 3: Aún así conseguir la excepción de memoria insuficiente, he cambiado el código en Picture.cs basado en las recomendaciones, pero estoy fuera de ideas. ¿Alguna ayuda?
public override void getFileInformation(string filePath)
{
FileInfo fileInformation = new FileInfo(filePath);
using (var image = Image.FromFile(filePath))
{
if (fileInformation.Exists)
{
Name = fileInformation.Name;
FileType = fileInformation.Extension;
Size = fileInformation.Length;
CreationDate = fileInformation.CreationTime;
ModificationDate = fileInformation.LastWriteTime;
Height = image.Height;
Width = image.Width;
}
}
}
Además, ¿debería abrir una nueva pregunta ahora que esta ha crecido un poco?
¿Puede darnos un rastro de pila de la excepción OOM? – Steven
¿Cómo puedo encontrar eso entonces lo proporciono? –
Una excepción lanzada tiene un seguimiento de pila, pero no importa que el problema ya se haya detectado en los métodos calculatePictureHeight y calculatePictureWidth. – Steven