2012-03-26 5 views
7

Ich schreibe ein einfaches Keylogger-Programm (für nicht bösartige Zwecke).Die Verwendung von File.AppendAllText verursacht einen "Prozess kann nicht auf die Datei zugreifen, bereits in Verwendung" Fehler

Hinweis: Dies ist mit .net 4.0 Client Profile

Jedes Mal, wenn ich das Programm zu starten, ich diesen Fehler:

The process cannot access the file 'C:\Users\.. ..\bin\Debug\log.log' because it is being used by another process. 

Hier ist mein Haupt-Code:

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Windows.Forms; 
using System.ComponentModel; 
using System.IO; 
using System.Text; 

namespace Logger 
{ 
    public partial class MainForm : Form 
    { 
     public string cWin = null; 
     public static string nl = Environment.NewLine; 

     public MainForm() 
     { 
      InitializeComponent(); 
     } 

     public static DialogResult AskOverwrite() 
     { 
      DialogResult result = MessageBox.Show("Log already exists. Overwrite?", 
       "Overwrite?", 
       MessageBoxButtons.YesNo, 
       MessageBoxIcon.Question); 

      return result; 
     } 

     private void MainForm_Resize(object sender, EventArgs e) 
     { 

      if (FormWindowState.Minimized == this.WindowState) 
      { 
        systray.Visible = true; 
        this.Hide();  
      } 
      else if (FormWindowState.Normal == this.WindowState) 
      { 
        systray.Visible = false; 
      } 
     } 

     private void SystrayMouse_DoubleClick(object sender, MouseEventArgs e) 
     { 
      this.Show(); 
      this.WindowState = FormWindowState.Normal; 
     } 

     private void HookManager_KeyPress(object sender, KeyPressEventArgs e) 
     { 
      if (Program.run) 
      { 
       output.AppendText(string.Format(e.KeyChar.ToString())); 
       File.AppendAllText(Program.file, e.KeyChar.ToString()); 
      } 
     } 

     private void Start_Click(object sender, EventArgs e) 
     { 
      if (!Program.run) 
      { 
       if (File.Exists(Program.file)) 
       { 
        if (AskOverwrite() == DialogResult.Yes) 
        { 
         File.Create(Program.file); 
        } 
       } 

       Program.run = true; 
       output.AppendText(string.Format("Logging started - {1}{0}", nl, System.DateTime.Now)); 
       File.AppendAllText(Program.file, string.Format("Logging started - {1}{0}", nl, System.DateTime.Now)); 
      } 
      else 
      { 
       output.AppendText(string.Format("Logging already started!{0}", nl)); 
      } 
     } 

     private void Stop_Click(object sender, EventArgs e) 
     { 
      if (Program.run) 
      { 
       Program.run = false; 
       output.AppendText(string.Format("{0}Logging stopped - {1}{0}", nl, System.DateTime.Now)); 
       File.AppendAllText(Program.file, string.Format("{0}Logging stopped - {1}{0}", nl, System.DateTime.Now)); 
      } 
      else 
      { 
       output.AppendText(string.Format("Logging already stopped!{0}", nl)); 
      } 
     } 

     private void getWindowTimer_Tick(object sender, EventArgs e) 
     { 
      if (cWin != CurrentWindow.GetActiveWindow() &&Program.run) 
      { 
       cWin = CurrentWindow.GetActiveWindow(); 
       if (cWin != null) 
       { 
        output.AppendText(string.Format("{0}Window - {1}{0}", nl, cWin)); 
        File.AppendAllText(Program.file, string.Format("{0}Window - {1}{0}", nl, cWin)); 
       } 
      } 
     } 
    } 
} 

Warum passiert das? Es war in Ordnung, wenn ich mit dieser Aussage war in die Datei schreiben:

using (StreamWriter sr = new StreamWriter(Program.file)) 
{ 
    sr.Write(string.Format("texthere"); 
} 

Aber es funktioniert nicht, wenn ich einfach mit umgeschaltet:

File.AppendAllText(Program.file, string.Format("texthere"); 
+1

Welche Version von .Net zielen Sie ab? – Brannon

+0

@Brannon Bearbeitete Frage –

+0

Das klingt offensichtlich, aber Sie haben Ihre Protokolldatei nicht in einem anderen Programm geöffnet, während Sie versuchen, darauf zu schreiben? –

Antwort

23

ich

File.Create(Program.file); 
sehen

das ist unnötig und wahrscheinlich das direkte Problem hier.

Es erstellt nicht nur eine leere Datei, sondern öffnet auch ein FileStream-Objekt, das Sie nirgends schließen. Der geöffnete FileStream ist nicht teilbar, so dass AppendAllText() fehlschlägt.

Entfernen Sie einfach die Zeile, AppendAllText() enthält die Logik create the file if it does not already exist

+0

Nun, das scheint ziemlich seltsam, aber es funktioniert! –

Verwandte Themen