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
peut-être vous devez vider() le flux en premier? – Jocke
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. –
@Jocke: J'ai aussi essayé flush(). Aucune différence. – duffy