it-swarm.com.de

System.IO.IOException: Datei, die von einem anderen Prozess verwendet wird

Ich habe an diesem kleinen Code gearbeitet, der trivial erscheint, aber ich kann nicht wirklich sehen, wo das Problem liegt. Meine Funktionen machen eine ziemlich einfache Sache. Öffnet eine Datei, kopiert den Inhalt, ersetzt eine Zeichenfolge und kopiert sie zurück in die Originaldatei (eine einfache Suche und Ersetzung dann in einer Textdatei) ... Ich wusste nicht wirklich, wie ich das machen soll Hinzufügen von Zeilen zur Originaldatei, also erstelle ich eine Kopie der Datei, (file.temp) kopiert auch eine Sicherung (file.temp), löscht dann die Originaldatei (Datei) und kopiert die Datei.temp in die Datei ..__ Ich erhalte eine Ausnahme beim Löschen der Datei .. Hier ist der Beispielcode:

private static bool modifyFile(FileInfo file, string extractedMethod, string modifiedMethod)
    {
        Boolean result = false;
        FileStream fs = new FileStream(file.FullName + ".tmp", FileMode.Create, FileAccess.Write);
        StreamWriter sw = new StreamWriter(fs);

        StreamReader streamreader = file.OpenText();
        String originalPath = file.FullName;
        string input = streamreader.ReadToEnd();
        Console.WriteLine("input : {0}", input);

        String tempString = input.Replace(extractedMethod, modifiedMethod);
        Console.WriteLine("replaced String {0}", tempString);

        try
        {
            sw.Write(tempString);
            sw.Flush();
            sw.Close();
            sw.Dispose();
            fs.Close();
            fs.Dispose();
            streamreader.Close();
            streamreader.Dispose();

            File.Copy(originalPath, originalPath + ".old", true);
            FileInfo newFile = new FileInfo(originalPath + ".tmp");
            File.Delete(originalPath);
            File.Copy(fs., originalPath, true);

            result = true;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }

        return result;
    }`

Und die damit verbundene Ausnahme

System.IO.IOException: The process cannot access the file 'E:\mypath\myFile.cs' because it is being used by another process.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.File.Delete(String path)
   at callingMethod.modifyFile(FileInfo file, String extractedMethod, String modifiedMethod)

Normalerweise stammen diese Fehler aus nicht geschlossenen Dateistreams, aber ich habe mich darum gekümmert. Ich schätze, ich habe einen wichtigen Schritt vergessen, kann aber nicht herausfinden, wo . Vielen Dank für Ihre Hilfe.

25
srodriguez

Klingt nach einem externen Prozess (AV?), Der ihn blockiert, aber können Sie das Problem überhaupt nicht vermeiden?

private static bool modifyFile(FileInfo file, string extractedMethod, string modifiedMethod)
{
    try
    {
        string contents = File.ReadAllText(file.FullName);
        Console.WriteLine("input : {0}", contents);
        contents = contents.Replace(extractedMethod, modifiedMethod);
        Console.WriteLine("replaced String {0}", contents);
        File.WriteAllText(file.FullName, contents);
        return true;
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
        return false;
    }
}
24
si618

Ich merke, dass ich ein bisschen spät komme, aber immer noch besser als nie. Ich hatte kürzlich ein ähnliches Problem. Ich habe XMLWriter verwendet, um die XML-Datei anschließend zu aktualisieren, und erhielt die gleichen Fehler. Ich habe die saubere Lösung dafür gefunden:

Die XMLWriter verwendet die zugrunde liegende FileStream, um auf die geänderte Datei zuzugreifen. Das Problem ist, dass beim Aufruf der XMLWriter.Close()-Methode der zugrunde liegende Stream nicht geschlossen wird und die Datei gesperrt wird. Sie müssen Ihre XMLWriter mit Einstellungen instanziieren und angeben, dass der zugrunde liegende Stream geschlossen werden muss.

Beispiel:

XMLWriterSettings settings = new Settings();
settings.CloseOutput = true;
XMLWriter writer = new XMLWriter(filepath, settings);

Ich hoffe es hilft.

19
roquen

Der Code funktioniert so gut ich kann. Ich würde Sysinternals Process Explorer starten und herausfinden, was die Datei geöffnet hält. Es könnte sehr gut Visual Studio sein.

5
chris.w.mclean

Es hat für mich funktioniert.

Hier ist mein Testcode. Testlauf folgt:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            FileInfo f = new FileInfo(args[0]);
            bool result = modifyFile(f, args[1],args[2]);
        }
        private static bool modifyFile(FileInfo file, string extractedMethod, string modifiedMethod) 
        { 
            Boolean result = false; 
            FileStream fs = new FileStream(file.FullName + ".tmp", FileMode.Create, FileAccess.Write); 
            StreamWriter sw = new StreamWriter(fs); 
            StreamReader streamreader = file.OpenText(); 
            String originalPath = file.FullName; 
            string input = streamreader.ReadToEnd(); 
            Console.WriteLine("input : {0}", input); 
            String tempString = input.Replace(extractedMethod, modifiedMethod); 
            Console.WriteLine("replaced String {0}", tempString); 
            try 
            { 
                sw.Write(tempString); 
                sw.Flush(); 
                sw.Close(); 
                sw.Dispose(); 
                fs.Close(); 
                fs.Dispose(); 
                streamreader.Close(); 
                streamreader.Dispose(); 
                File.Copy(originalPath, originalPath + ".old", true); 
                FileInfo newFile = new FileInfo(originalPath + ".tmp"); 
                File.Delete(originalPath); 
                File.Copy(originalPath + ".tmp", originalPath, true); 
                result = true; 
            } 
            catch (Exception ex) 
            { 
                Console.WriteLine(ex); 
            } 
            return result; 
        }
    }
}


C:\testarea>ConsoleApplication1.exe file.txt padding testing
input :         <style type="text/css">
        <!--
         #mytable {
          border-collapse: collapse;
          width: 300px;
         }
         #mytable th,
         #mytable td
         {
          border: 1px solid #000;
          padding: 3px;
         }
         #mytable tr.highlight {
          background-color: #eee;
         }
        //-->
        </style>
replaced String         <style type="text/css">
        <!--
         #mytable {
          border-collapse: collapse;
          width: 300px;
         }
         #mytable th,
         #mytable td
         {
          border: 1px solid #000;
          testing: 3px;
         }
         #mytable tr.highlight {
          background-color: #eee;
         }
        //-->
        </style>
4
Robert Harvey

Nachdem ich auf diesen Fehler gestoßen bin und im Internet nichts gefunden habe, was mich richtig eingestellt hat, dachte ich, ich würde einen weiteren Grund für diese Ausnahme hinzufügen - nämlich, dass der Quell- und der Zielpfad im Befehl zum Kopieren von Dateien identisch sind. Ich habe eine Weile gebraucht, um das herauszufinden, aber es kann hilfreich sein, Code hinzuzufügen, um eine Ausnahme auszulösen, wenn Quell- und Zielpfade auf dieselbe Datei verweisen.

Viel Glück!

4
Alan

Führen Sie zufällig einen Echtzeit-Antiviren-Scanner aus? Wenn dies der Fall ist, können Sie versuchen, den Scanner (vorübergehend) zu deaktivieren, um herauszufinden, ob dies der Zugriff auf die zu löschende Datei ist. (Chris 'Vorschlag, den Sysinternals Process Explorer zu verwenden, ist gut). 

3
Moe Sisko

Versuchen Sie Folgendes: Es funktioniert auf jeden Fall. Wenn die Datei nicht vorhanden ist, wird sie erstellt und anschließend geschrieben. Und wenn es bereits existiert, wird es kein Problem öffnen und darauf schreiben:

 using (FileStream fs= new FileStream(@"File.txt",FileMode.Create,FileAccess.ReadWrite))
 { 
   fs.close();
 }
 using (StreamWriter sw = new StreamWriter(@"File.txt")) 
 { 
   sw.WriteLine("bla bla bla"); 
   sw.Close(); 
 } 
3
PureSilence

Nach dem Erstellen einer Datei müssen Sie den Stream zwingen, die Ressourcen freizugeben:

//FSm is stream for creating file on a path//
System.IO.FileStream FS = new System.IO.FileStream(path + fname,
                                                   System.IO.FileMode.Create);
pro.CopyTo(FS);
FS.Dispose();
0
Faisal Arshad