2016-06-30 1 views
1

내 폴더를 나열하기 위해이 글을 쓰려고했는데, 추가 부분이 작동하지 않고 전체 내용을 다시 씁니다. 나는 그 응용 프로그램을 종료하지 않고 뭔가를 나열하려고하면 각 루프의 끝에 close()를 사용했기 때문에 "파일이 사용 중이다"라는 오류가 발생합니다.C# close()와 함께 사용중인 파일이 작동하지 않습니다.

나는 거의 모든 Microsoft 문서와 여기에서 많은 게시물을 확인했지만 내 대답을 찾을 수 없습니다.

The Picture that shows the Error I get

미리 감사!

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

namespace Anime_Lister 
{ 
    public partial class Anime0Lister : Form 
    { 


     public void Appen() 
     { 
      using (System.IO.StreamWriter file = new System.IO.StreamWriter(path0save.Text, true)) 
      { 


       DirectoryInfo directory = new DirectoryInfo(path0tb.Text); 

       DirectoryInfo[] directory0Arr = directory.GetDirectories(); 

       foreach (DirectoryInfo dir in directory0Arr) 
       { 
        String Parent = Convert.ToString(dir.Parent); 
        String Name = Convert.ToString(dir.Name); 
        String Root = Convert.ToString(dir.Root); 


        File.AppendAllText(path0save.Text, Parent); 
        File.AppendAllText(path0save.Text, " || "); 
        File.AppendAllText(path0save.Text, Name + System.Environment.NewLine); 
        File.AppendAllText(path0save.Text, Root + System.Environment.NewLine); 


       } 

      } 
     } 

     public void Writer() 
     { 

      using (System.IO.StreamWriter file = new System.IO.StreamWriter(path0save.Text)) 
      { 

       DirectoryInfo directory = new DirectoryInfo(path0tb.Text); 

       DirectoryInfo[] directory0Arr = directory.GetDirectories(); 

       foreach (DirectoryInfo dir in directory0Arr) 
       { 
        String Parent = Convert.ToString(dir.Parent); 
        String Name = Convert.ToString(dir.Name); 
        String Root = Convert.ToString(dir.Root); 

        file.Write(Parent); 
        file.Write(" || "); 
        file.WriteLine(Name); 

        file.WriteLine(Root); 




       } 

      } 



     } 


     public void Browser() 
     { 

      FolderBrowserDialog address = new FolderBrowserDialog(); 
      if (address.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
       path0tb.Text = address.SelectedPath; 



     } 

     public void Browser2() 
     { 

      if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
      { 
       path0save.Text = saveFileDialog1.FileName; 
      } 



     } 

     public Anime0Lister() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      //_____________________________________________________________List 







      { 

       try 
       { 


        if (existing0file.Checked == true) 
        { 
         Appen(); 
        } 
        else 
        { 
         Writer(); 
        }  

       } 


       catch (Exception Fail) 
       { 
        MessageBox.Show(Fail.Message); 


       } 



      } 

     } 


    } 
} 
+1

당신은 잘못된 방법을 사용하고 있습니까? "File.AppendAllText"가 아니라 "file.Write"입니까? –

+0

다른 함수에서는 file.appenedalltext –

+0

을 사용하는 경우 그 함수에 "file"을 전달해야합니다. 그렇지 않으면 파일에 어떻게 추가하고 싶습니까? 아마 당신은 매번 새로운 파일을 만듭니다. –

답변

4

StreamWriter 같은 일회용 객체는 항상에도 예외의 경우, 개체를 닫을하고 관리되지 않는 리소스는 재사용을 위해 해제 된 것을 확인하기 위해 사용 계산서로 묶어야합니다. 이 언어는 구체적인 문구 (Using Stetement)를 제공하지만 특정 경우에 StreamWriter을 사용하여 파일을 열면 File.AppendAllText을 사용할 수 없습니다.이 방법은 파일을 열려고 시도하기 때문에 사용할 수 없습니다. 이전으로 '를 사용 ...

public void Appen() 
    { 
     using(System.IO.StreamWriter file = new System.IO.StreamWriter(path0save.Text, true)) 
     { 
      DirectoryInfo directory = new DirectoryInfo(path0tb.Text); 
      DirectoryInfo[] directory0Arr = directory.GetDirectories(); 

      foreach (DirectoryInfo dir in directory0Arr) 
      { 
       // No need for those Convert.ToString. 
       // The DirectoryInfo properties used are already strings. 

       file.Write(dir.Parent); 
       file.Write(" || "); 
       file.WriteLine(dir.Name); 
       file.WriteLine(dir.Root); 

       // or just in one line 
       //file.WriteLine(string.Concat(dir.Parent, 
       //      " || ", 
       //      dir.Name, 
       //      Environment.NewLine, 
       //      dir.Root)); 

      } 
     } 
    } 

라이터 방법에 적용되어야 같은 using 문 StreamWriter를

+0

시간을내어 내 질문에 답해 주셔서 감사합니다.하지만 파일이 다른 프로세스에서 사용 중이라는 동일한 오류가 표시됩니다. (실제로 부품을 추가하기 위해 사용했습니다.) –

+0

이 코드를 테스트했지만 이런 종류의 오류가 발생하지 않았으므로 아마도 다른 곳에 문제가있을 수 있습니다. (두 개의 텍스트 상자가 같은 폴더를 가리키는 경우에도) 첫 번째 텍스트 상자에 폴더 이름이 아닌 파일 이름이 포함되어 있습니까? (예외가 다르긴하지만) – Steve

+0

는 문제를 보여주는 그림에 대한 링크를 추가하여 현재 코드를 전체 코드로 변경했습니다 (한 번 더 감사드립니다). 주로 부분 추가에 집중합니다. –

관련 문제