• 締切済み

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

みんなの回答

  • oboroxx
  • ベストアンサー率40% (317/792)
回答No.2

エラーメッセージを書きましょう。 一見すると、#1の回答者の指摘が真っ先に浮かぶのですが、エラーメッセージがわかれば、もっとアドバイスが出来るかと思います。

回答No.1

FormやらUserControlやらの中に処理を書くことの可否はともかく……。 Form側で作成したときに,ちゃんとStreamWriterを閉じていますか。 原則として,System.IO.Streamの継承クラスやStreamWriter/StreamReaderをnewしたり,File.Open等で取得した場合は, usingステートメントを使うべきです。 > StreamWriter sw = new StreamWriter(new FileStream"C:\\Documents and Settings\\My Documents\\log\\" + file_name + ".txt", FileMode.CreateNew)); using (var stream = File.Create(@"C:\Documents and Settings\My Documents\log\" + file_name + ".txt")) { } // stream.Disposeが呼び出され,streamが閉じられる > StreamWriter sw = new StreamWriter(new FileStream("C:\\Documents and Settings\\My Documents\\log\\"+ f1.File_name +".txt", FileMode.Append)); ... > sw.Close(); using (var sw = File.AppendText(@"C:\Documents and Settings\My Documents\log\" + file_name + ".txt")) { ... } // sw.Disposeが呼び出され,swが閉じられる

sss-aoring
質問者

補足

ご回答ありがとうございます。 ここには記入し忘れたのですが、ちゃんとStreamWriterは閉じています。すみません。 実際は以下のように記入しています。 <Form1.cs(一部)> public void select_button_Click(object sender, EventArgs e) { int Num = this.listBox1.SelectedIndex - 1; if (this.listBox1.SelectedIndex == -1) { MessageBox.Show("選択されていません。", "通知"); } else { //問題読み込み //StreamReaderオブジェクトの作成 StreamReader sr = new StreamReader("C:\\Documents and Settings\\My Documents\\no"+ Num+ ".txt", Encoding.Default); //開いた時刻をファイル名に指定 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)); //作成日時 sw.Write(dt.ToString()+","); //問題番号 sw.WriteLine("no"+ Num ); //1行ずつ読み込み string dat; //文字を入れる int i = 1; while ((dat = sr.ReadLine()) != null) { //カンマで区切られた文字列を取得 string[] sbuf = dat.Split(','); //読み込んだデータをラベルテキストに代入 UserControl1 c1 = this.Controls["userControl1" + i.ToString()] as UserControl1; c1.Number = sbuf[1]; i++; } //ファイルを閉じる sr.Close(); sw.Close(); } } アドバイスいただいたusingステートメントは使ったことがないので、書き直そうと試みましたがエラーが出て書き直せばよいかわかりませんでしたm(__)m 出来れば今の状態のまま改良したいのですが・・・可能でしょうか?;;

関連するQ&A

  • 一時ファイルをsavefileDialogを利用して保存するにはどのようにしたら良いのでしょうか?

    環境:VS2005 C# プログラム上でコメントアウトしてある様なやり方ではなく、 一旦、一時ファイルを作成しそのファイルをダイアログで保存先を任意のフォルダに保存したいのですがやり方はあるのでしょうか? OpenFileDialog ofd = new OpenFileDialog(); //一時ファイルを作成する string file_name = Path.GetTempFileName(); System.IO.StreamWriter writer = new StreamWriter(file_name); writer.WriteLine("tmptest"); writer.Close(); //ダイアログを表示 ofd.ShowDialog(); /*******************************▼コメントアウト System.IO.Stream stream; stream = ofdfilecommit.OpenFile(); if (stream != null) { //ファイルに書き込む System.IO.StreamWriter sw = new System.IO.StreamWriter(stream, 文字コード); sw.WriteLine("test"); //閉じる sw.Close(); stream.Close() } ********************************▲コメントアウト*/ //オブジェクトの破棄 ofd.Dispose(); ご協力お願いします。

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

  • FirefoxでFormのfileでファイルのパスが取得できない

    フォーム<form>内のファイル名入力フィールド<input type="file">をPOSTで取得すると、IE6では「パス名:ファイル名」が取得されるのですが、Firefox2.0では「ファイル名」しか取得できません。 FirefoxでもIEと同様に「パス名:ファイル名」を取得するにはどうしたらよいでしょうか? 例えば、デスクトップに「a.txt」ファイルがあれば IE6では「C:\\Documents and Settings\\Administrator\\デスクトップ\\a.txt」 Firefox2.0では「a.txt」 と表示されます。 FirefoxでもIEと同じようにするにはどうすれば良いでしょうか? よろしくお願いします。 以下はソースです。 ---------------------ソース-------------------------------- <html> <body> <form method="post" action="<?=$_SERVER["PHP_SELF"]?>"> <input type="file" name="file"> <input type="submit" name="Submit"> </form> <?php echo $_POST['file']; ?> </body> </html> ---------------------ソース--------------------------------

    • ベストアンサー
    • PHP
  • ファイル選択と同時にアップロード HTML+JS

    HTMLとJava Scriptのことを質問させてください <form>タグからファイルを選択すると同時をアップロードしたいと思っています。 複数の「ファイルを選択ボタン」を設置し、それぞれ"001.jpg"、"002.jpg"など指定の名前でアップロードしたいです。 下記のようにいくつかの<form>タグを設置し、javascriptでコントロールできるかと思いケース1のように書いた場合はうまくいったのですが、ケース2のように複数並べて記述した場合、動かなくなり困っております。 どなたか教えていただけないでしょうか? よろしくお願いいたします ケース1) <form id="upload_file1" action="file_upload.php" method="post" enctype="multipart/form-data" target="upload_frame">    <input type="hidden" name="picture_id" value="001.jpg" />    <input type="file" id="file_id_1" name="file_name" accept="image/jpeg"> </form> <form id="upload_file2" action="file_upload.php" method="post" enctype="multipart/form-data" target="upload_frame">    <input type="hidden" name="picture_id" value="002.jpg" />    <input type="file" id="file_id_2" name="file_name" accept="image/jpeg"> </form> <script> var form = document.getElementById("upload_file1"); var input = form.file_name; input.onchange = function (){ if(this.value){ form.submit(); } }; </script> ケース2) <form id="upload_file1" action="file_upload.php" method="post" enctype="multipart/form-data" target="upload_frame">    <input type="hidden" name="picture_id" value="001.jpg" />    <input type="file" id="file_id_1" name="file_name" accept="image/jpeg"> </form> <form id="upload_file2" action="file_upload.php" method="post" enctype="multipart/form-data" target="upload_frame">    <input type="hidden" name="picture_id" value="002.jpg" />    <input type="file" id="file_id_2" name="file_name" accept="image/jpeg"> </form> <script> var form = document.getElementById("upload_file1"); var input = form.file_name; input.onchange = function (){ if(this.value){ form.submit(); } }; var form = document.getElementById("upload_file2"); var input = form.file_name; input.onchange = function (){ if(this.value){ form.submit(); } }; </script>

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

    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.NET テキストファイルにデータを書き込み

    テキストファイル("c:\test.txt")に「かきくけこ」と全角5文字で1行のデータがあるとします。 このテキストファイルに「あいうえお」を先頭に追加で書き込みたいのですが、どうすればいいのでしょうか? あくまで「かきくけこ」を変数化せずファイルに直接、書き込む方法がある場合、教えてください。 'テキストファイルを開いたときの内容 あいうえお かきくけこ ちなみにですが、テキストファイル("c:\test.txt")に「かきくけこ」と全角5文字で1行のデータがあるとして、 末尾に「さしすせそ」を追加で書込みする方法は下記の通りでした。 'ファイルを書き込み用に開く、指定したファイルがない場合は作成する dim fsFile As System.IO.FileStream = _ System.IO.File.OpenWrite("c:\test.txt") 'StreamWriterオブジェクトを作成し、テキストデータが書き込めるようにする Dim sw As System.IO.StreamWriter = _ New System.IO.StreamWriter(fsFile) 'ファイルの末尾に移動する sw.BaseStream.Seek(0, System.IO.SeekOrigin.End) 'データを書き込む sw.WriteLine("さしすせそ") 'ファイルを更新する sw.Flush() 'ファイルを閉じる sw.Close() fsFile.Close() 'テキストファイルを開いたときの内容 かきくけこ さしすせそ

  • サーバーにあるファイルの内容を表示

    自分のサーバで温度データを測定しそれを web公開したいと考えています。No.1 <html> <head> <title>サンプル</title> <script type="text/javascript"> <!-- function jikoku() { iomode=1; format=0;//ASCII format //file object myobject=new ActiveXObject("Scripting.FileSystemObject"); //file open file=myobject.OpenTextFile("c:\\Log.txt",iomode,true,format); //read until eof dd=""; while(!file.AtEndOfStream){ dd+=file.ReadLine()+"\n"; } file.Close(); //display document.F1.T1.value = dd; window.setTimeout("jikoku()", 1000); } // --> </script> </head> <body onload="jikoku()"> <form name="F1" action="#"> <input type="text" name="T1" size=50> </form> </body> </html> のプログラムをつくり うまくいったと思ったのですが Javascriptのため クライアントのパソコンではクライアントの c:\\Log.txtを読みに行ってしまうので ダメなことが分かりました。 そこで PHPで No.2 <html> <meta http-equiv="refresh" content="60"> <head> <title>温度・湿度</title> </head> <body> <?php $file = fopen("C:\\Log.txt","r"); $dd = fgets($file); print("$dd"); fclose($file); ?> </body> を作って 大体のところうまく表示できたのですが 画面を refreshしているところが なんとも 気になります。 サーバー上の プログラムを読んで  No.1のような 表示はできないでしょうか・・・・ C:\\Log.txtの更新間隔は いまのところ 1分間隔です。 Javascriptと PHPで できると思うのですが・・・・ よろしく お願いします。

    • ベストアンサー
    • PHP
  • textファイルの内容の削除について(C#です)

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

  • ファイルの排他

    ログの出力/照会時の排他処理について、教えて下さい。 環境 言語:VC++/CLI OS:Win VISTA 前提 ログ出力 ・APL起動時にログファイルをオープンする。  (基本的にはオープンしっぱなし) ・メッセージ受信などイベント取得時にログに書き込む。  (複数スレッドからの書込み処理あり) ・最大行数に達したら、ファイルをクローズして、  新規にファイルをオープンしてそちらに書き込む。  (aaa_1.log, aaa_2.log,・・・という具合) ログ照会 ・画面からボタン押下で今まで書き込んだログを照会する。 ・ログ照会時はオープン→リード→クローズとなります。 質問 複数スレッドから書込み処理がある場合に備えて排他をかける 「読み込み時に書込み発生(EOFがおかしくなるとか)」や 「書込み時に読み込み発生(行の半端なところで表示されるとか)」など、バッティングした際を考慮した排他のかけ方 について注意点があればご教授頂きたいのですが・・・ 単純に以下のような実装イメージでよろしいのでしょうか? //////////////////////////////////// 書込み処理 //変数定義 StreamWriter^ sw = nullptr; 起動時 メソッド1 sw = gcnew StreamWriter( "TestFile.txt" ); 最大行数に達したら メソッド2 sw->Close(); sw = gcnew StreamWriter( "TestFile2.txt" ); //イベント発生 メソッド3 //排他処理 sw->WriteLine( "aaaa" ); //排他解除 //////////////////////////////////// //////////////////////////////////// 照会処理 //n=ファイルサイズを求めておく; //排他処理 StreamReader^ sr = gcnew StreamReader( "TestFile.txt" ); array<Char>^c = nullptr; while ( sr->Peek() >= 0 ) { c = gcnew array<Char>(n); sr->Read( c, 0, c->Length ); //ある理由でReadLineが                  //使えそうにないです                  //理由を説明すると                  //長くなりそうなので                  //省かせて下さい //画面出力領域 ← c } sr->Close(); //排他解除 //////////////////////////////////// 以上、宜しくお願い致します。

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

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

専門家に質問してみよう