web-dev-qa-db-fra.com

"Le processus ne peut pas accéder au fichier car il est utilisé par un autre processus" avec Images

J'ai constaté que de nombreux problèmes de ce type avaient été résolus, principalement en raison de la mauvaise élimination des flux.

Mon problème est légèrement différent, suivez ici un extrait de code

 foreach (Images item in ListOfImages)
 {
      newPath = Path.Combine(newPath, item.ImageName + item.ImageExtension);
      File.Create(newPath);

      File.WriteAllBytes(newPath, item.File);
 }

Images est une structure personnalisée et item.File est la donnée brute, octet [].

Mon problème est qu’à la ligne où la WriteAllBytes est appelée, une exception est levée. Le message se lit comme suit:

The process cannot access the file because it is being used by another process

Encore une fois, je ne sais pas comment je vais en quelque sorte close le processus.

9
Scriptworks

Puisque File.Create renvoie le flux, je le disposerais correctement:

using(var stream = File.Create(newPath)){}
File.WriteAllBytes(newPath, item.File);

ou vous pouvez utiliser le flux pour écrire directement dans le fichier:

using (FileStream fs = File.Create(newPath))
{
    fs.Write(item.File, 0, item.File.Length);
}

ou, probablement le plus simple, utilisez File.WriteAllBytes alone:

File.WriteAllBytes(newPath, item.File);

Crée un nouveau fichier, écrit le tableau d'octets spécifié dans le fichier, puis ferme le fichier . Si le fichier cible existe déjà, il est remplacé par .

21
Rango

Vous déclarez que votre problème n'a rien à voir avec la suppression des flux, mais consultez cet article MSDN:

http://msdn.Microsoft.com/en-us/library/d62kzs03.aspx

Que renvoie File.Create? Un FileStream !!!!

Et, en fin de journée, pourquoi utilisez-vous File.Create si File.WriteAllBytes crée un fichier s'il n'existe pas? ;)

Crée un nouveau fichier, écrit le tableau d'octets spécifié dans le fichier, puis ferme le fichier . Si le fichier cible existe déjà, il est remplacé par .

Vérifiez également sur MSDN: http://msdn.Microsoft.com/en-us/library/system.io.file.writeallbytes.aspx

4

La méthode create ouvre le fichier en écriture et renvoie un objet FileStream avec lequel vous pourrez travailler. Le fait que vous ne le référeniez pas ne le fait pas signifie qu'il n'a pas besoin d'être retourné.

foreach (Images item in ListOfImages)
                {
                    newPath = Path.Combine(newPath, item.ImageName + item.ImageExtension);
                    FileStream f = File.Create(newPath);

                    f.Write(item.File, 0, item.File.Length);
                }
using (FileStream fs = 
new FileStream(filePath,
    FileMode.Open, FileAccess.Read, FileShare.ReadWrite))

Votre journal est peut-être verrouillé en écriture, essayez donc avec FileShare.ReadWrite.

1
Ashwin Patil

C'est le moyen le plus spécifique d'accomplir ce que vous essayez de faire:

foreach (Images item in ListOfImages)
{
    using (System.IO.FileStream output = new System.IO.FileStream(Path.Combine(newPath, item.ImageName + item.ImageExtension),
        System.IO.FileMode.Create, System.IO.FileAccess.Write))
    {
        output.Write(item.File, 0, item.File.Length);
        output.Flush();
        output.Close();
    }
}

Vous devez également corriger votre logique pour créer le chemin, ce que j'ai fait dans l'exemple ci-dessus. Vous avez concaténé newPath maintes et maintes fois.

0
Lawrence Johnson

Le File.WriteAllBytes crée le fichier si nécessaire. Vous pouvez utiliser:

foreach (Images item in ListOfImages)
{
    newPath = Path.Combine(newPath, item.ImageName + item.ImageExtension);
    File.WriteAllBytes(newPath, item.File);
}

Et combinez-vous le chemin correctement?

0
Hamlet Hakobyan