Question

Je le code qui enregistre un fichier pdf.

FileStream fs = new FileStream(SaveLocation, FileMode.Create);
fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
fs.Flush();
fs.Close();

Il fonctionne très bien. Cependant parfois, il ne libère pas le verrou tout de suite et que les causes exceptions de verrouillage des fichiers avec des fonctions lancer après une exécution.

Y at-il un moyen idéal pour libérer le verrou de fichier juste après fs.Close ()

Était-ce utile?

La solution

Voici l'idéal:

using (var fs = new FileStream(SaveLocation, FileMode.Create))
{
    fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
}

qui est à peu près équivalent à:

FileStream fs =  null;
try
{
    fs = new FileStream(SaveLocation, FileMode.Create);
    fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
}
finally
{
    if (fs != null)
    {
        ((IDisposable)fs).Dispose();
    }
}

utilisant être plus lisible.


Mise à jour:

@aron, maintenant que je pense

File.WriteAllBytes(SaveLocation, result.DocumentBytes);

regarde même plus joli à l'œil que l'idéal: -)

Autres conseils

Nous avons vu cette même question dans la production d'une enveloppe de déclaration en utilisant (le).

L'un des principaux coupables ici est un logiciel anti-virus qui peut se faufiler après le fichier est fermé, la saisir pour vérifier qu'il ne contient pas de virus avant de le relâcher.

Mais même avec tous les logiciels anti-virus hors du mélange, dans les systèmes de charge très élevés avec des fichiers stockés sur des partages de réseau, nous avons vu encore parfois le problème. A, toux, courte Thread.Sleep (), toux, après la clôture semblait guérir. Si quelqu'un a une meilleure solution que j'aimerais l'entendre!

Je ne peux pas imaginer pourquoi la serrure serait maintenue après que le dossier est fermé. Mais vous devriez envisager d'envelopper cela dans un statment en utilisant pour faire en sorte que le fichier est même fermé si une exception est levée

using (FileStream fs = new FileStream(SaveLocation, FileMode.Create))
{
  fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);  
}

Si les fonctions qui fonctionnent après celui-ci font partie de la même application, une meilleure approche pourrait consister à ouvrir le fichier en lecture / écriture au début de l'ensemble du processus, puis passer le fichier à chaque fonction sans fermer jusqu'à la fin du processus. Ensuite, il sera nécessaire pour l'application de bloquer en attente de l'opération IO complète.

Cela a fonctionné pour moi lors de l'utilisation .Flush () je devais ajouter un proche dans l'instruction à l'aide.

 using (var imageFile = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite,FileShare.ReadWrite))
 {
     imageFile.Write(bytes, 0, bytes.Length);
     imageFile.Flush();
     imageFile.Close();
  }

Juste eu le même problème quand je fermais un FileStream et ouvert le fichier immédiatement dans une autre classe. L'instruction à l'aide n'a pas été une solution puisque le FileStream avait été créé à un autre endroit et stocké dans une liste. Suppression de la liste ne suffit pas.

Il semble que le flux doit être libéré par le collecteur des ordures avant de pouvoir être réutilisé le fichier. Si le temps entre la fermeture et l'ouverture est trop courte, vous pouvez utiliser

GC.Collect();

juste après avoir fermé le flux. Cela a fonctionné pour moi.

Je suppose que les solutions de Ian Mercer pour mettre le fil à dormir pourrait avoir le même effet, ce qui donne le temps de GC pour libérer les ressources.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top