Frage

Ich habe auf diesem kleinen Stück Code arbeitet, die trivial scheint aber immer noch, ich kann nicht wirklich sehen, wo das Problem ist. Meine Funktionen machen eine ziemlich einfache Sache. Öffnet eine Datei, seinen Inhalt zu kopieren, ersetzen eine Zeichenfolge innerhalb und kopieren Sie sie zurück in die ursprüngliche Datei (eine einfache Suche und Ersetzen in einer Textdatei dann). Ich wusste wirklich nicht, wie das zu tun, wie ich hinzufüge Zeilen in die Original-Datei, so dass ich nur eine Kopie der Datei, (file.temp) erstellen kopiert auch eine Sicherung (file.temp), dann löschen Sie die Originaldatei (Datei) und kopieren Sie die file.temp Datei. Ich erhalte eine Ausnahme während der Löschen der Datei zu tun. 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 kommen diese Fehler aus unverschlossener Datei-Streams, aber ich habe davon gesorgt. Ich glaube, ich habe einen wichtigen Schritt vergessen, kann aber nicht herausfinden, wo. Vielen Dank für Ihre Hilfe,

War es hilfreich?

Lösung

Klingt wie ein externer Prozess (AV?) Blockiert, aber können Sie das Problem in erster Linie 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;
    }
}

Andere Tipps

Ich weiß, dass ich ein bisschen spät, aber immer noch besser spät als nie. Ich habe ähnliches Problem vor kurzem. Ich benutzen XMLWriter anschließend XML-Datei zu aktualisieren und wurde die gleichen Fehler zu empfangen. Ich fand die saubere Lösung für diese:

Die XMLWriter verwenden zugrunde liegenden FileStream die geänderte Datei zuzugreifen. Das Problem ist, dass, wenn Sie XMLWriter.Close() Methode aufrufen, die zugrunde liegenden Stream nicht geschlossen bekommt und sperrt die Datei. Was Sie tun müssen, ist Ihren XMLWriter mit Einstellungen instanziiert und angeben, dass Sie benötigen, die zugrunde liegende Stream geschlossen.

Beispiel:

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

Hoffe, es hilft.

Der Code funktioniert so gut ich sagen kann. Ich würde Feuer Sysinternals Process Explorer und herauszufinden, was die hält Datei öffnen. Es könnte sehr gut sein, Visual Studio.

Es funktioniert für mich.

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>

über diesen Fehler Nachdem kommen und nicht alles auf dem Netz zu finden, die mich richtig gesetzt, dachte ich, dass ich einen anderen Grund hinzufügen würde diese Ausnahme für immer - nämlich, dass die Quell- und Zielpfade in der Datei kopieren Befehl sind die gleichen. Es dauerte eine Weile, um es herauszufinden, aber es kann helfen, Code hinzufügen irgendwo eine Ausnahme zu werfen, wenn Quell- und Zielpfade in die gleiche Datei zeigen.

Viel Glück!

Sind Sie mit einem Echtzeit-Anti-Virus-Scanner durch Zufall? Wenn ja, könnten Sie (vorübergehend) versuchen, es zu deaktivieren, um zu sehen, ob das ist, was die Datei zugreift, können Sie versuchen, zu löschen. (Chris' Vorschlag Sysinternals Process Explorer zu verwenden ist gut).

Versuchen Sie folgendes: Es ist in jedem Fall funktioniert, wenn die Datei nicht existiert, wird sie es schaffen und dann schreiben. Und wenn bereits vorhanden ist, wird kein Problem es öffnen und schreiben, um es:

 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(); 
 } 

eine Datei Nach dem Erstellen müssen Sie den Strom 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();
 System.Drawing.Image FileUploadPhoto = System.Drawing.Image.FromFile(location1);
                                 FileUploadPhoto.Save(location2);
                                 FileUploadPhoto.Dispose();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top