2016-04-18 2 views
0

Ich versuche, ein Bild aus dem Dateisystem abzurufen und den Inhalt durch eine HTTPResponseMessage übergeben und löschen Sie das Bild danach. Ich kann die Antwort bekommen, das Bild erfolgreich passieren, aber es kann nicht wegen der Fehler löschen:C# - Zurücksenden eines JPEG in Web API, kann Datei nicht löschen, weil es von einem anderen Prozess verwendet wird

The process cannot access the file 'C:...\Temp\c8530aae-ae92-49f3-8f62-cd1f5467fe8a1.jpeg' because it is being used by another process.

Mein Controller-Code:

{ 
    Image returnImg = Image.FromFile(@"C:\...\Temp\" + id + "1" + ".jpeg"); 
    MemoryStream memoryStream = new MemoryStream(); 
    returnImg.Save(memoryStream, ImageFormat.Jpeg); 

    var message = new HttpResponseMessage(HttpStatusCode.OK) 
    { 
     Content = new ByteArrayContent(memoryStream.ToArray()) 
    }; 
    message.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); 
    File.Delete(@"C:\...\Temp\" + id + "1" + ".jpeg"); //error is on this line execution 
    return message 
} 

ich ihm etwas Figur hat mit dem Speicher-Stream zu tun, da fehlt mir eine enge Operation?

Antwort

1

Das Image-Objekt returnImg implementiert die IDisposable-Schnittstelle. Sie müssen es in einen {} Block einfügen. Außerdem wird MemoryStream nicht ordnungsgemäß geschlossen.

Wenn eine Klasse IDisposable-Klasse implementiert und Sie eine Instanz der Klasse erstellen Sie es in einem mit Block wickeln sollen, so kann die Klasse das Objekt properly.Try zerstören:

{ 
     using(Image returnImg = Image.FromFile(@"C:\...\Temp\" + id + "1" + ".jpeg")) 
     { 
     using(MemoryStream memoryStream = new MemoryStream()) 
     { 
     returnImg.Save(memoryStream, ImageFormat.Jpeg); 

     var message = new HttpResponseMessage(HttpStatusCode.OK) 
     { 
      Content = new ByteArrayContent(memoryStream.ToArray()) 
     }; 
} 
     message.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); 
} 
     File.Delete(@"C:\...\Temp\" + id + "1" + ".jpeg"); //error is on this line execution 
     return message 
    } 
Verwandte Themen