2016-05-19 30 views
0

私はC#のメモ帳を作成していますが、私はほとんど完了していますが、theresは最後の問題です。 ファイルを保存できません。ファイルを開いて変更して保存しようとすると、そのファイルがすでにプロセスによって使用されているというエラーが表示されます。私は、このプロセスは私のオープンファイルメソッドによって開始されると確信しています。私はそのファイルを保存ダイアログを開く方法を持っていますが、ダイアログを必要としない、ただちにファイルを保存する方法があります。cntrl n保存すると、何を意味するのか理解できます。このファイルを保存するにはどうすればよいですか?

マイオープンファイル方式

private void openItem_Click(object sender, EventArgs e) 
    { 
     Stream myStream; 
     OpenFileDialog openFileDialog1 = new OpenFileDialog(); 

     if (openFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      if ((myStream = openFileDialog1.OpenFile()) != null) 
      { 
       string srtfilename = openFileDialog1.FileName; 
       string filetext = File.ReadAllText(srtfilename); 
       GetRichTextBox().Text = filetext; 

       tabControl1.SelectedTab.Text = Path.GetFileName(openFileDialog1.FileName); 

       GlobalPath = openFileDialog1.FileName; 
      } 

      openFileDialog1.Dispose(); 
     } 

ダイアログでファイルのメソッドを保存するマイ、この1つは動作しますが、私は、私はすでに使用していたファイルを選択した場合、それがクラッシュします。

private void saveAsItem_Click(object sender, EventArgs e) 
    { 
     SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 

     if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      using (Stream s = File.Open(saveFileDialog1.FileName, FileMode.Create)) 
      using (StreamWriter sw = new StreamWriter(s)) 
      { sw.Write(GetRichTextBox().Text); } 

      tabControl1.SelectedTab.Text = Path.GetFileName(saveFileDialog1.FileName); 

      saveFileDialog1.Dispose(); 
     } 
    } 

マイファイルの保存方法迅速、と1つのイム持つ問題。これは私がこれまでに試したことです。

+1

あなたのアプリをデバッグして例外がスローされるのを見てみませんか? – Fang

+0

@Fangここに質問を投稿するのは簡単です... –

+0

@Fangここに投げられる例外は、所有プロセスが何であるかを教えてくれるのではなく、他の何かがファイルを所有していて、確かに、ストリームを使ってファイルを開くというコンテキストを含めると解決策が見つかる可能性がありますが、例外だけでは不十分です。 – Diosjenin

答えて

5

ファイルを開く方法と読み込む方法は、あまりにも複雑で、私はそれがあなたの問題の原因だと思います。 Streamオブジェクトを未配置のままにしておきます。 IDisposableを実装するものは、usingステートメントでラップするか、明示的に処理する必要があります。

はここで開いているファイル方式の優れた実装です:

private void openItem_Click(object sender, EventArgs e) 
{ 
    using (var openFileDialog1 = new OpenFileDialog()) 
    { 
     if (openFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      try { 
       string srtfilename = openFileDialog1.FileName; 
       string filetext = File.ReadAllText(srtfilename); 
       GetRichTextBox().Text = filetext; 

       tabControl1.SelectedTab.Text = Path.GetFileName(openFileDialog1.FileName); 

       GlobalPath = openFileDialog1.FileName; 
      } 
      catch (Exception ex) 
      { 
       // you may wish to log the entire exception including stack trace here 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 
} 

あなたは、ファイルが存在するかどうかだけをチェックするストリームを必要としません。そして今、あなたはファイルを保持する未知のリソースを残していません。

また、ファイルが存在しない場合、FileOpenDialogは実際にはデフォルトでユーザーに警告するので、ファイルが存在するかどうかをチェックするか、チェックしないでください。if (File.Exists(strfilename))

あなたはFile.ReadAllTextFile.WriteAllTextに固執する必要がありますが、単純なテキストエディタで直接Streamオブジェクトをいじりする必要はないのです、それはきれいだし、シンプルなコードであなたを残します。

+0

私がこの回答に追加する唯一のことは、 'FileNotFoundException'は' File.ReadAllText() 'から投げることができる唯一の例外ではありません([here](https://msdn.microsoft.com/en- us/library/ms143368%28v = vs.110%29.aspx)を参照してください)。一意のメッセージを表示する例外タイプごとに複数のキャッチブロックが存在するか、またはジェネリックな 'Exception'をキャッチし、' ex.Message'に含まれるものが何であれ表示されるブロックが1つ必要です。 – Diosjenin

+0

@Diosjeninはい、もちろんそうです。編集されました。 – Blorgbeard

+0

ありがとう、それは完璧に働いた。 –

関連する問題