2016-12-13 2 views
-1

J'ai essayé de nombreuses façons de procéder, et il me dit toujours que le fichier est en cours d'utilisation lorsque j'essaie de le supprimer avant de le sauvegarder de nouveau.Impossible d'enregistrer le fichier car il est en cours d'utilisation

if (Clipboard.GetDataObject().GetData(DataFormats.Bitmap) != null) 
{ 
    if (File.Exists(filename)) { File.Delete(filename); } 
    using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite)) 
    { 
     ImageConverter converter = new ImageConverter(); 
     byte[] bytes = (byte[])converter.ConvertTo(Clipboard.GetDataObject().GetData(DataFormats.Bitmap), typeof(byte[])); 
     fs.Write(bytes, 0, bytes.Length); 
     fs.Close(); 
     fs.Dispose(); 
    } 
} 

Comme vous pouvez le voir, j'ai tout dans un bloc "using". J'ai également "fermé" le fichier, et j'ai même essayé d'appeler explicitement le "disposer". Mais quand je réexécute le code, il me dit toujours que le fichier est en cours d'utilisation. Que puis-je faire pour pouvoir écraser le fichier?

J'ai aussi essayé de cette façon:

using (Bitmap bmp = new Bitmap((Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap))) 
{ 
    if (bmp != null) 
    { 
     if (File.Exists(filename)) { File.Delete(filename); } 
     using (MemoryStream memory = new MemoryStream()) 
     { 
      using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite)) 
      { 
       bmp.Save(memory, ImageFormat.Bmp); 
       byte[] bytes = memory.ToArray(); 
       fs.Write(bytes, 0, bytes.Length); 
       fs.Close(); 
      } 
      memory.Dispose(); 
     } 
     bmp.Dispose(); 
     break; 
    } 
} 

et il me donne toujours la même erreur.

+0

Avez-vous ajouté cela plus tard, après avoir essayé de fermer votre programme sans supprimer le flux? Il est possible que l'ancien flux "flotte" autour de votre ordinateur et bloque le fichier et maintenant vous ne pouvez plus le fermer parce que vous n'y avez pas accès. Vous pourriez essayer de redémarrer votre ordinateur, alors ce problème devrait être résolu (si c'est le problème). – Lehue

+0

Il pourrait y avoir d'autres façons de tuer un flux de fichiers perdu, mais je n'en connais pas (honnêtement, je ne les ai jamais cherché non plus). – Lehue

+0

Il y a probablement une raison à cela. Y at-il autre chose qui utilise le fichier/chemin de fichier que vous avez créé? Peut-être que le chemin du fichier est retourné à quelque chose qui fait quelque chose avec lui et le verrouille ou ne nettoie pas un flux? Très probablement ce n'est pas dans le code que vous nous avez montré jusqu'à présent qu'il y a un bloc qui utilise autour de votre FileStream. Je suis prêt à parier que si vous mettez cela dans une boucle, il réussira également (en supposant que le fichier n'est pas verrouillé lorsque vous entrez). – Igor

Répondre

0

Si le fichier est déjà verrouillé avant l'exécution de votre programme, vous ne pourrez pas l'ouvrir. Voyez si vous pouvez le déverrouiller en utilisant un programme comme Unlocker. Une fois le fichier déverrouillé, vous devriez pouvoir l'ouvrir à nouveau.

Lorsque vous enroulez les flux de fichiers dans une instruction using{}, les appels close(); et dispose(); ne sont pas nécessaires. Ils sont effectués pour vous lorsque le code quitte l'instruction using{}. Il ne fait pas de mal à appeler close(); mais il est redondant. Cependant, si vous appelez le dispose(); et la fin des appels utilisant dispose();, vous obtiendrez probablement une exception car vous appelez dispose(); sur un objet éliminé. Retirez vos appels close(); et dispose();

Si vous processus de bout 'sur votre programme via le Gestionnaire des tâches (mangler) ou cliquez sur le bouton « stop » dans votre IDE alors que le programme a été mise en boucle à l'intérieur du bloc using{}, il se verrouille la fichier à nouveau et vous devrez utiliser 'Unlocker' à nouveau. Par conséquent, supprimez vos appels close() et dispose(), puis utilisez «Unlocker» pour déverrouiller le fichier. Lancez votre programme, et vous devriez être en or ...

MISE À JOUR:

Mettez un bloc try/catch autour du code ci-dessous:

 bmp.Save(memory, ImageFormat.Bmp); 
     byte[] bytes = memory.ToArray(); 
     fs.Write(bytes, 0, bytes.Length); 

Voir si jamais vous obtenez une exception dans ce qui précède morceau de code. Si vous mettez un try/catch autour, il peut pointer vers la raison pour laquelle le problème se produit ..

+0

Le fichier n'existe même pas avant que j'exécute mon programme, je le crée. Je comprends que "l'utilisation" fait tout cela pour moi, j'ai seulement ajouté ceux-ci pour une certitude absolue et parce que je me tape la tête contre le mur en essayant de comprendre pourquoi cela ne fonctionne pas comme il se doit. Je ne reçois pas d'erreur de ces appels supplémentaires. Mais je les ai enlevés, et je reçois toujours la même erreur lors de la deuxième tentative. –

+0

S'il vous plaît voir mes mises à jour ci-dessus. Peut-être qu'un essai/catch pourrait éclairer la solution. – Curtis