2009-02-12 9 views
2

J'utilise un fichier RTF comme modèle pour une application Web ASP.NET. Mon code VB.NET lit le fichier à l'aide d'un StreamReader, remplace certaines chaînes et crée un nouveau document Word avec des données de la base de données. Mon code se ferme et dispose du StreamReader. Cependant, lorsque je tente de télécharger un fichier RTF révisé sur le serveur Web, une erreur se produit: «Impossible d'ouvrir le fichier pour écriture». Il est donc évident que le fichier reste ouvert longtemps après l'exécution de la page ASP.NET..NET StreamReader ne se ferme pas

Comment puis-je forcer StreamReader à se fermer? Même l'édition du fichier web.config pour forcer le redémarrage de l'application Web n'est pas suffisante pour supprimer le verrou de ce fichier.

+0

Si vous fermez et disposez qui semble étrange, pouvez-vous coller un exemple de code? –

+0

Je suis d'accord. Y a-t-il des opérations en cours ici? –

+0

J'ai un site web de développement qui ouvre un fichier sur le site de production. Il semble que je doive modifier le web.config sur le site Web de production pour redémarrer l'application Web et publier le fichier même si c'est le site Web de développement qui l'a ouvert. – rsrobbins

Répondre

4

envisager d'utiliser le « en utilisant » idiome, également disponible dans VB.net

using(StreamReader reader = new StreamReader(...)) { 

} 

le flux va se fermer, même si exception est levée

envisageraient toutes les implémentations IDisposable comme celui-ci

1

Il semble étrange si elle s'accroche même après une fermeture/élimination. Utilisez-vous un FileStream avec StreamReader? En général, j'utilise un FileStream pour contrôler l'accès au fichier et nourrir que la StreamReader, à la:

FileStream fsIn = new FileStream("path",FileMode.Open, FileAccess.Read, FileShare.None); 
StreamReader srIn = new StreamReader(fsIn, System.Text.Encoding.Default); 

//...do stuff.... 

srIn.close(); 
srIn.Dispose(); 
fsIn.close(); 
fsIn.Dispose(); 

Mieux encore, si vous limitez l'utilisation de votre StreamReader à une méthode, coller le Fermer/Disposez dans un Enfin.

+0

Je suggère également d'utiliser la directive "using". –

+0

Que puis-je dire? Je suis démodé :-) –

+0

Cela me fait penser que je n'ai jamais vraiment testé si Dispose() ferme le flux, mais je fais confiance à la documentation! –

0

Assurez-vous que le flux est enfin fermé.

FileStream fsIn = null; 
StreamReader srIn = null; 

try 
{ 
    fsIn = new FileStream("path",FileMode.Open, FileAccess.Read, FileShare.None); 
    srIn = new StreamReader(fsIn, System.Text.Encoding.Default); 

    //...do stuff.... 

} 
catch (Exception ex) 
{ 
} 
finally 
{ 
    srIn.close(); 
    srIn.Dispose(); 
    fsIn.close(); 
    fsIn.Dispose(); 
} 
Questions connexes