• ベストアンサー

C#です。教えて下さい!!

C#でプログラミングしています。 今、あるデータをsampleというまだ何も書いていないテキストファイルに書き込みをしています。 それは、 StreamWriter writer = new StreamWriter("E:\\sample\\sample.txt"); とかいています。 そして、sampleに書かれたデータをさらにsample_recordという配列に入れています。 実行すると成功するのですが、何度か実行すると 「別のプロセスで使用されているため、プロセスはファイル 'E:\sample\sample.txt' にアクセスできません。」 というエラーがでます。これはなぜですか? 何度も実行できるようにしたいので、教えて下さい。

noname#46927
noname#46927

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

通常,ファイルへ書き込む場合は他の場所 (自プロセス/他プロセス,自スレッド/他スレッド問わず) で開いていない状態でないといけません。 例えば, using (StreamWriter sw1 = new StreamWriter(@"E:\sample\sample.txt")) using (StreamWriter sw2 = new StreamWriter(@"E:\sample\sample.txt")) { } なんて書くだけでも,sw2で例外が発生します。 恐らく,開いたファイルをちゃんと閉じていないのだと思います。 その結果,たまたまGCが発生した場合はファイナライザでファイルが閉じられていたためにエラーにはならなかったが, GCが発生しなかった場合にはファイルが閉じられていないために例外が発生したのでしょう。 ・ファイルを使わなくなったら必ず閉じる (StreamWriter.Close()を呼び出す。usingを併用しておくと安全) ・同一のファイルを開きっぱなしにしておくなら,二度開かないようにする といった対処をする必要があります。

noname#46927
質問者

お礼

アドバイスありがとうございます!!

その他の回答 (1)

  • tanma3
  • ベストアンサー率58% (14/24)
回答No.1

>「別のプロセスで使用されているため、プロセスはファイル 'E:\sample\sample.txt' にアクセスできません。」というエラーがでます。 上記はStreamWriterクラスがスレッドセーフではないからです。 たぶんsample.txtを解放していないのに、違うスレッドがsample.txtにアクセスしようとしているので上記エラーが発生するのでしょうね。 なので、エラーを出さない為には、スレッドセーフにする必要があります。 スレッドセーフラッパー実装については参考URLを参考にして下さい。

参考URL:
http://msdn2.microsoft.com/ja-jp/library/system.io.streamwriter(VS.80).aspx
noname#46927
質問者

お礼

アドバイスありがとうございます!!

関連するQ&A

  • textファイルの内容の削除について(C#です)

    C#でプログラミングをしています。 WriteLineを使って、textに書き込みをしているのですが、最後いったんこのファイルに書き込んだ文字をすべて消去できるようにしたいんですが、どのように書けばいいですか? 例えば、 StreamWriter writer = new StreamWriter("E:\\sample\\sample.txt"); writer.WriteLine("りんご"); と書き込んで、最後に「りんご」という文字を全て消去できるようにしたいんです。初心者なので、あんまり分からないので教えて下さい(><)

  • ファイルの作成からその使用に際して

    VB2008Expressでプログラミング中です。 早速ですが、この度ボタンを押すと3種の.txtファイルを作成し、ある文字列をそこに保存する、といったプログラムが必要になったのですが不具合がでて困っています。 sub createfile() IO.file.create("d:\1.txt") IO.file.create("d:\2.txt") IO.file.create("d:\3.txt") end sub private sub button_click()handles button1.click call createfile() Dim Writer As New IO.StreamWriter("d:\1.txt") Writer.WriteLine(Richtextbox1.Text) Writer.Close() Dim Writer As New IO.StreamWriter("d:\2.txt") Writer.WriteLine(Richtextbox2.Text) Writer.Close() Dim Writer As New IO.StreamWriter("d:\3.txt") Writer.WriteLine(Richtextbox3.Text) Writer.Close() end sub といった感じでファイルを作成したらそこにテキストを保存するようにしたいのですが、「ファイルが使用中でアクセスできません」とエラーになります。 いろんなサイトで勉強してみたのですが、いまいち理由がわかりません。どなたか教えていただける方はいませんでしょうか?

  • VB 配列の内容をファイルに書き込む

    VB2008を使用しています。 stg_bitという配列に一文字ずつ「abc・・・」 のように入っているものを、テキストファイルに出力したいのですが・・・ stg_bitという配列の内容をファイルに書き込みたいのですが、 うまくいきません。 ご教授お願いします!! Dim i As Integer Dim stg_str As String Dim Writer As New IO.StreamWriter("C:sample.txt") Writer.WriteLine(stg_bit) Writer.Close()

  • textデータからの読み込み

    C#でプログラミングをしています。 textデータ→ファイル名はsample このデータには、「ノート」「本」「消しゴム」 とか単語がいくつか書かれているんですが、これを読んできて配列に入れようとしたいんです。 そこで、 string[] sample_record = File.ReadAllLines("E:\\sample\\sample.txt", System.Text.Encoding.GetEncoding("Shift_JIS")); というプログラムを書きました。そしたら、実際にsample_recordに入っているのは、文字化けしたのが入ってしまいます。 stringでしているのに、そのまま単語が読めず文字化けするのは何故ですか??

  • 2008で「別のプロセスで使用されているため、プロセスはファイル'○○○' にアクセスできません

    VB2008初心者です。 System.IO.StreamReaderを使って、あるテキストファイルを1行ずつ読み込み、それを配列に格納し、配列データを修正したうえで、次にSystem.IO.StreamWriterを使って同じテキストファイルに配列のデータを書き込むというプログラムを組んでいます。 ところが、ビルドすると「別のプロセスで使用されているため、プロセスはファイル 'C:\Management Student\personal.txt' にアクセスできません。」というメッセージが表示されてしまいます。 このメッセージの原因と対処方法をご存知の方、教えていただけないでしょうか。

  • 【C#】作成したファイルに書き込みしたい

    開発環境はMicrosoft VisualC#2008です。 C#初心者です。よろしくお願いします。 現在、Form1とUserControl1を組み合わせてパズルゲームを作成中です。 Form1でボタンをクリックすると、クリックした日時を取得して、その日時をファイル名とするテキストファイルを作成することは出来ました。(例:20100115154717.txt) 今度は、そのファイルをUserControl1で開いて、書き込みをしていきたいのですが、エラーが出てしまい、この作成したファイルに書き込むことが出来ない状況です。 ※ちなみに、別のファイル(log_sample.txt)を指定したら書き込みは出来ました。 アドバイスよろしくお願いします。 <Form1.cs>一部抜粋 public string File_name { get { return this.file_name; } set { this.file_name = value; } } private void select_button_Click(object sender, EventArgs e) { //開いた時刻をファイル名に指定 DateTime dt = DateTime.Now; file_name = dt.ToString("yyyyMMddHHmmss"); //ログファイル作成・データ追加 StreamWriter sw = new StreamWriter(new FileStream"C:\\Documents and Settings\\My Documents\\log\\" + file_name + ".txt", FileMode.CreateNew)); } <UserControl1.cs>一部抜粋 //候補選択 private void label1_Click(object sender, EventArgs e) { Form1 f1 = this.Controls["Form1"] as Form1; DateTime dt = DateTime.Now; //ログ書き込み(日付、場所(ユーザーコントロール、ラベル名)、クリック(1)orダブルクリック(2)) StreamWriter sw = new StreamWriter(new FileStream("C:\\Documents and Settings\\My Documents\\log\\"+ f1.File_name +".txt", FileMode.Append)); sw.Write(dt.ToString()+","); sw.Write(this.Name +","); sw.Write("label1,"); sw.WriteLine("1"); sw.Close(); }

  • renameTo()メソッドについて

    もうひとつお願いいたします。 ファイル名をリネームするプログラムを作りたいのです。 そこでリファレンスを見ると、 renameTo()と言うちょうどよさそうなメソッドを見つけました。 カレントディレクトリに testと言うフォルダを作りSampleと言うダミーTXTを置いてHenkaに変わるかどうか実験しました。 File d = new File(".\\test\\Sample.txt"); File e = new File(".\\test\\Henka.txt"); d.renameTo(e); .... まったく変化なしです(^_^;) そこでグーグルでちょっと調べたところ”ファイルを移動する”ために使うと言う記述ばかりでした・・・ そこでeを File e = new File(".\\test\\Henka\\Sample.txt"); のようにしてTESTフォルダにさらにHenkaフォルダを作って実行しました・・・ すると 見事に(??)移動しました・・・(~_~;) これはどういうことなんでしょうか・・・ リファレンスには確かに「ファイル名変更」とあります。 なのに移動・・・ どうすればリネームできるか、教えてほしいです・・・

    • ベストアンサー
    • Java
  • VB2008 txtファイル保存

    こんにちは、Vb2008を勉強しています。 デスクトップに保存している、TXTファイルに、 フォームで入力したデータを追加保存したいと思い、ネットで調べたり…で 入力しましたが、txtファイルを開いてみると文字化けしてしまします。 Dim writer As System.IO.FileStream = _ System.IO.File.OpenWrite("C:\Users\Desktop\顧客管理.txt") 'SystemWriterオブジェクトを作成し、テキストデータが書き込めるようにする Dim sw As System.IO.StreamWriter = New System.IO.StreamWriter(writer) 'ファイルの末尾に移動する sw.BaseStream.Seek(0, System.IO.SeekOrigin.End) 'データを書き込む sw.WriteLine(TextBox1.Text & "," & TextBox2.Text & "," & TextBox3.Text) 'ファイルを更新する sw.Flush() 'ファイルを閉じる sw.Close() writer.Close() 上記の方法で文字化けだったので、またまた、調べて入力しましたが 今度は、改行されず…単純な、データの追加のようになってしまっています。 私は、新しい行に追加できるようにしたいです。 下のコードは文字コードの指定をしたので、保存はできますが、 改行されません。 Dim FileName As String = "C:\Users\Desktop\確認.txt" Dim Writer As IO.StreamWriter Dim Encode As System.Text.Encoding '文字コードにShiftJISを指定。 Encode = System.Text.Encoding.GetEncoding("Shift-JIS") '既に存在するテキストに追加する場合は第2引数をTrueにする。 Writer = New IO.StreamWriter(FileName, True, Encode) Writer.Write(TextBox1.Text & "," & TextBox2.Text) Writer.Close() どなたか、教えていただけませんでしょうか?

  • Visual C++ 2010 のファイル書き出し

    private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { String^ string1; string1=""; StreamWriter^ swriter1=gcnew StreamWriter("C:sample005.txt"); swriter1->WriteLine(string1); swriter1->Close(); } Visual C++ 2010 のWindowsフォームアプリケーションで、 ボタンのクリックからファイルを書き出したいのですが、上記ではエラーが出て動きません どのようにすれば良いのでしょうか?

  • C# StreamReader,StreamWriter による文字化

    C# StreamReader,StreamWriter による文字化け お世話になります。 文字化けで悩んでいます。 Visual Studio 2008 C# にて、テキストファイルからデータを読んで別のテキストファイルに そのまま書き出す(もちろん実際の運用では加工するわけですが)処理で文字化けが起こります。 そのテキストファイル自身を C# で作れば問題はないのですが、メモ帳を使って書き込んだファイルでは 文字化けが起こります。 対処方法があれば教えてください。 以下はその実験に使ったコードです。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { // これは正常に書き込みできました StreamWriter sw = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test.txt"); sw.WriteLine("これはてすとです。"); sw.WriteLine("This is test."); sw.Close(); // これも正常に読み込め、書き込みもできました StreamReader sr = new StreamReader(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test.txt"); sw = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\newtest.txt"); while (!sr.EndOfStream) { sw.WriteLine(sr.ReadLine()); } sr.Close(); sw.Close(); // 次はあらかじめメモ帳で作ったファイルを読んで、別のファイルに書き出します // これが文字化けします sr = new StreamReader(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\test2.txt"); sw = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\newtest2.txt"); while (!sr.EndOfStream) { string dat = sr.ReadLine(); sw.WriteLine(dat); Console.WriteLine(dat); } sr.Close(); sw.Close(); } } }

専門家に質問してみよう