title: ASP.net c# File being used by another process
body: <p>I create thumbnails with the following page, Thumbnail.ashx:</p>
  
  <pre><code>&lt;%@ WebHandler Language="C#" Class="Thumbnail" %&gt;
  
  using System;
  using System.Drawing;
  using System.Drawing.Drawing2D;
  using System.Drawing.Imaging;
  using System.IO;
  using System.Web;
  
  public class Thumbnail : IHttpHandler {
  
      private int _thumbnailSize = 150;
  
      public void ProcessRequest(HttpContext context) {
          string photoName = context.Request.QueryString["p"];
  
          string cachePath = Path.Combine(HttpRuntime.CodegenDir, photoName + ".png");
          if (File.Exists(cachePath)) {
              OutputCacheResponse(context, File.GetLastWriteTime(cachePath));
              context.Response.WriteFile(cachePath);
              return;
          }
          string photoPath = context.Server.MapPath("../uploads/originals/" + photoName);
          Bitmap photo;
          try {
              photo = new Bitmap(photoPath);
          }
          catch (ArgumentException) {
              throw new HttpException(404, "Photo not found.");
          }
          context.Response.ContentType = "image/png";
          int width, height;
          if (photo.Width &gt; photo.Height) {
              width = _thumbnailSize;
              height = photo.Height * _thumbnailSize / photo.Width;
          }
          else {
              width = photo.Width * _thumbnailSize / photo.Height;
              height = _thumbnailSize;
          }
          Bitmap target = new Bitmap(width, height);
          using (Graphics graphics = Graphics.FromImage(target)) {
              graphics.CompositingQuality = CompositingQuality.HighSpeed;
              graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
              graphics.CompositingMode = CompositingMode.SourceCopy;
              graphics.DrawImage(photo, 0, 0, width, height);
              using (MemoryStream memoryStream = new MemoryStream()) {
                  target.Save(memoryStream, ImageFormat.Png);
                  OutputCacheResponse(context, File.GetLastWriteTime(photoPath));
                  using (FileStream diskCacheStream = new FileStream(cachePath, FileMode.CreateNew)) {
                      memoryStream.WriteTo(diskCacheStream);
                  }
                  memoryStream.WriteTo(context.Response.OutputStream);
              }
          }
      }
  
      private static void OutputCacheResponse(HttpContext context, DateTime lastModified) {
          HttpCachePolicy cachePolicy = context.Response.Cache;
          cachePolicy.SetCacheability(HttpCacheability.Public);
          cachePolicy.VaryByParams["p"] = true;
          cachePolicy.SetOmitVaryStar(true);
          cachePolicy.SetExpires(DateTime.Now + TimeSpan.FromDays(365));
          cachePolicy.SetValidUntilExpires(true);
          cachePolicy.SetLastModified(lastModified);
      }
  
      public bool IsReusable {
          get {
              return true;
          }
      }
  }
  </code></pre>
  
  <p>When I try to delete the picture file physically or through code, I get a 'cannot access file, being used by another process" error.</p>
  
  <p>Is this caused by the caching of the thumbnail?  Or is the file not being closed somewhere I can't spot?</p>
  
  <p>Could it be my upload file script is causing this?</p>