2010-11-19 20 views
0

Mon application Asp.net MVC nécessite un téléchargement de fichier. Au cours du téléchargement, je voudrais manipuler le fichier fraîchement téléchargé.La manipulation du fichier fraîchement téléchargé provoque 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(); 

Le problème avec cet extrait est que toute tentative de manipuler le fichier téléchargé initialement génère un IOException (« Le processus ne peut pas accéder au fichier car il est utilisé par un autre processus. ») Bien sûr, je peux contourner le problème en copiant plutôt que de déplacer le fichier téléchargé, mais je ne peux toujours pas le supprimer une fois que j'ai une meilleure alternative.

Un conseil? Duffy

+0

peut-être vous devez vider() le flux en premier? – Jocke

+0

Couple de questions: HttpPostedFileBase est-il votre propre implémentation sous le capot? (J'ai remarqué que c'est abstrait dans les docs). Quel est le code de FileIsSmallEnough? Habituellement, vous obtenez cette erreur de processus quand une partie de votre propre code au-dessus du point de problème n'a pas fermé/disposé lui-même et est conçu pour contenir des descripteurs de fichiers. La classe File static helper contient quelques méthodes qui renvoient des objets qui contiennent des fichiers. Par exemple, si vous ne disposez pas de ces objets, le pot-luck sera résolu si le GC l'efface avant de l'utiliser. –

+0

@Jocke: J'ai aussi essayé flush(). Aucune différence. – duffy

Répondre

2

Comme vous l'avez mentionné dans vos commentaires, vous chargez un Image à partir du fichier. La documentation MSDN indique que le fichier reste verrouillé jusqu'à ce que l'image est supprimée.

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

Pour se débarrasser de votre image, vous pouvez appeler la méthode Dispose sur l'instance, ou utiliser le mécanisme préféré de la déclaration using:

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

    } 
} 

Cela devrait résoudre le problème.

+0

C'est tout, merci !!! – duffy