2010-11-19 14 views
0

Neden Asp.net MVC uygulamasında bir dosya yükleme işlemi gerekiyor. Yükleme sırasında yeni yüklenen dosyayı değiştirmek istiyorum.Yeni yüklenen dosyayı işlemek IOException

public ActionResult Edit(int id, FormCollection collection) { 
    Block block = userrep.GetBlock(id); 
    foreach (string tag in Request.Files) { 
     var file = Request.Files[tag] as HttpPostedFileBase; 

     if (file.ContentLength == 0) 
      continue; 

     string tempfile = Path.GetTempFileName() 
     file.SaveAs(tempfile); 
     // This doesn't seem to make any difference!! 
     // file.InputStream.Close(); 

     if (FileIsSmallEnough(file)) { 
      // Will throw an exception!! 
      File.Move(tempfile, permanentfile); 
     } else { 
      GenerateResizedFile(tempfile, permanentfile); 
      // Will throw an exception!! 
      File.Delete(tempfile); 
     } 

     block.Image = permanentfile; 
    } 
    userrep.Save(); 

bu snippet'iyle sorun başlangıçta yüklenen dosyayı işlemek için herhangi bir girişim bir IOException oluşturmasıdır ("başka bir işlem tarafından kullanıldığı için işlem dosyaya erişemiyor.") Tabii ki atlayabilir yüklenen dosyayı taşımak yerine kopyalayarak sorun ama daha iyi bir alternatife sahip olduğumda yine de silemiyorum.

Herhangi bir öneri? Duffy

+0

Belki de önce akışı akıtmak zorunda mısın? – Jocke

+0

Soruların birkaçı: HttpPostedFileBase uygulaması kendi başlığın altında mı? (Dokümanlarda soyut olduğunu fark ettim). FileIsSmallEnough için kod nedir? Genellikle, kendi kodunuzun bir kısmı problem noktasının üstünde kapanmadığında/imha edilmediğinde ve işlem tutamaçlarını tutmak için tasarlandığında bu işlem hatasını alırsınız. Dosya statik yardımcı sınıfı, dosyaları saklayan nesneleri döndüren birkaç yöntem içerir; örneğin, bunları kullanmadan önce GC temizlenirse, pot şansınızı yok ederseniz. –

+0

@Jocke: Ben de flush() denedim. Fark yok. – duffy

cevap

2

Yorumlarınızda belirtildiği gibi, bir Image dosyasını dosyadan yüklersiniz. MSDN belgeleri, dosya imha edilene kadar dosyanın kilitli kaldığını belirtir.

private bool FileIsSmallEnough() 
{ 
    using (Image i = Image.FromFile()) 
    { 

    } 
} 

Bu sorunu çözmek gerekir:

http://msdn.microsoft.com/en-us/library/stf701f5.aspx

Eğer örneğinde Dispose yöntemini çağırın veya using ifadesinin tercih mekanizmasını kullanabilir ya da görüntüyü bertaraf etmek.

+0

İşte bu, teşekkürler !!! – duffy

İlgili konular