2013-09-23 75 views
5

Tôi đang phát xung quanh với C# và tôi gặp sự cố. Khi tôi cố gắng tạo một tệp mới, chương trình sẽ ngắt và nói rằng tệp đang được sử dụng bởi một quy trình khác. Nó có thể là một cái gì đó ngu ngốc mà tôi bỏ qua, nhưng tôi không thể tìm ra nó!ngoại lệ C#. Tệp đang được sử dụng bởi một quy trình khác

Đây là mã của tôi:

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

Xin lỗi vì đoạn mã dài, nhưng vì tôi không chắc chắn nơi mà vấn đề bắt nguồn từ tôi đã phải bao gồm khá nhiều tất cả mọi thứ.

Trả lời

9

Vấn đề của bạn là File.Create sẽ mở ra một stream cho phép bạn làm những gì bạn muốn tập tin:

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

Tệp luồng cung cấp quyền truy cập đọc/ghi vào tệp được chỉ định trong đường dẫn.

Do đó, về mặt kỹ thuật, nó đang được sử dụng.

Chỉ cần xóa hoàn toàn File.Create. StreamWriter sẽ xử lý việc tạo tệp nếu nó không tồn tại.

Ngoài ra, hãy đầu tư vào số using cấu hình để xử lý đúng các kết nối tệp của bạn. Sẽ giúp tránh điều này trong tương lai.

+0

Cảm ơn! Nó đã làm việc. Tôi sẽ chấp nhận sau 6 phút (SO sẽ không cho phép tôi chấp nhận) –

1

Sử dụng

myDropDown_invokedMethod(); 

thay vì

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

Cảm ơn! Đó không phải là điều gây ra ngoại lệ, nhưng tôi chắc chắn sẽ thay đổi nó. –

0

Thats vì File.Create (NameTb.Text + ".txt"); giữ mở file:

thử sử dụng này để thay thế:

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

này wil buộc File.Create để được xử lý khi phương pháp này có lối thoát hiểm. Việc xử lý sẽ đóng filehandle (win32 unmanaged handle). Nếu không, tập tin sẽ bị đóng bởi bộ thu gom rác, nhưng bạn không bao giờ biết khi nào.

1

File.Create trả về đối tượng FileStream chứa tệp của bạn. Bạn nên sử dụng đối tượng này để thực hiện thêm.

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

hoặc bạn có thể làm chỉ

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

Vấn đề của bạn có vẻ là trong SaveBtn_Click sự kiện, bạn đang sử dụng tập tin điểm đến của bạn hai lần để viết:

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

Hủy bỏ dòng này:

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

Theo MSDN, File.Create Method (String) sử dụng FileStream trong trường hợp của bạn không bị đóng. Sử dụng một cái gì đó như thế này:

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

hoặc @Muctadir Dinar

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