2013-09-23 18 views
5

Gram z C# i napotkałem problem. Kiedy próbuję utworzyć nowy plik, program pęka i mówi, że plik jest używany przez inny proces. To chyba coś głupiego, którego przeoczyłem, ale nie mogę tego zrozumieć!Wyjątek C#. Plik jest używany przez inny proces

Oto mój kod:

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

namespace myNameSpace 
{ 
    public partial class MainWindow : Form 
    { 
     public static string folderPath = @"fullpath"; 
     public MainWindow() 
     { 
      InitializeComponent(); 
      StoredTb.Text = folderPath; 
      String[] files = Directory.GetFiles(folderPath); 
      foreach (string file in files) 
       myDropDown.Items.Add(Path.GetFileNameWithoutExtension(file)); 
     } 

     private void myDropDown_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      this.BeginInvoke(new MethodInvoker(myDropDown_invokedMethod)); 
     } 

     private void myDropDown_invokedMethod() 
     { 
      string fullpath = MainWindow.folderPath + myDropDown.SelectedText + ".txt"; 
      StreamReader sr = new StreamReader(fullpath); 
      NameTb.Text = myDropDown.SelectedText; 
      DescriptionTb.Text = sr.ReadToEnd(); 
      sr.Close(); 
     } 

     private void SaveBtn_Click(object sender, EventArgs e) 
     { 
      File.Create(NameTb.Text + ".txt"); 
      TextWriter tw = new StreamWriter(NameTb.Text + ".txt"); /* this is where the problem occurs */ 
      tw.WriteLine("The very first line!"); 
      tw.Close(); 
     } 
    } 
} 

Przepraszam za długi fragment kodu, ale ponieważ nie jestem pewien, gdzie źródłem problemu musiałem obejmują prawie wszystko.

Odpowiedz

9

Twój problem polega na tym File.Create otworzy stream pozwala robić to, co chcesz do pliku:

http://msdn.microsoft.com/en-us/library/d62kzs03.aspx

A FileStream, który zapewnia dostęp do odczytu/zapisu do pliku określonego w ścieżce.

Dlatego technicznie jest już używany.

Całkowicie usunąć File.Create. StreamWriter zajmie się tworzeniem pliku, jeśli nie istnieje.

Należy również zainwestować w konstrukcje using, aby prawidłowo pozbyć się również połączeń z plikami. Pomoże to tego uniknąć w przyszłości.

+0

Dzięki! Zadziałało. Przyjmuję w ciągu 6 minut (więc nie pozwolę sobie jeszcze zaakceptować) –

1

Zastosowanie

myDropDown_invokedMethod(); 

zamiast

this.BeginInvoke(new MethodInvoker(myDropDown_invokedMethod)); 
+0

Dzięki! To nie było przyczyną wyjątku, ale dopilnuję, żeby to zmienić. –

0

To dlatego, że plik File.Create (NameTb.Text + ".txt"); utrzymuje otwarty plik:

stosowanie try to zamiast:

private void SaveBtn_Click(object sender, EventArgs e) 
    { 
     using(Stream stream = File.Create(NameTb.Text + ".txt")) 
     { 
      TextWriter tw = new StreamWriter(stream); /* this is where the problem was */ 
      tw.WriteLine("The very first line!"); 
      tw.Close(); 
     } 
    } 

To wil zmusić File.Create być usuwane, gdy metoda ma wyjścia. Dispose zamknie uchwyt pliku (win32 niezarządzany uchwyt). W przeciwnym razie plik zostanie zamknięty przez garbage collector, ale nigdy nie wiadomo, kiedy.

1

File.Create zwraca obiekt FileStream, który przechowuje twój plik. Powinieneś użyć tego obiektu do dalszego zadania.

var fileStream = File.Create(NameTb.Text + ".txt"); 
//... do all the writing using fileStream 
fileStream.Close(); 

czy można zrobić tylko

var fs = File.Create(NameTb.Text + ".txt"); 
fs.Close(); 
TextWriter tw = new StreamWriter(NameTb.Text + ".txt"); 
tw.WriteLine("The very first line!"); 
tw.Close(); 
1

Twój problem wydaje się być w SaveBtn_Click razie używasz plik docelowy dwukrotnie na piśmie:

File.Create(NameTb.Text + ".txt"); 
TextWriter tw = new StreamWriter(NameTb.Text + ".txt"); 

Usuń ten wiersz:

File.Create(NameTb.Text + ".txt"); 
1

Zgodnie MSDN File.Create Method (String) używa FileStream co w Twoim przypadku nie jest zamknięty. Używać coś takiego:

FileStream fs = new FileStream(NameTb.Text + ".txt"); 
File.Create(fs); 
fs.Close(); 

lub @Muctadir Dinar

var fileStream = File.Create(NameTb.Text + ".txt"); 
//... do all the writing using fileStream 
fileStream.Close(); 
Powiązane problemy