前提・実現したいこと
C#のWindowsフォームアプリケーションを用いて、「センサから受け取った値を次々にcsvファイルに保存し、その保存したものと既存のものとの差を最新の一つだけグラフ上に点として表示する」というものを作るために、まず「csvファイルに一秒ごとに数値を保存し、それと既存のファイルとの差を一秒ごとにグラフ上に最新の一つだけ表示する」というものを作成しようと思いました。
またC#を触ることが初めてで、色々見ながらしてみたため読みづらく拙いと思いますがよろしくお願いします。
発生している問題・エラーメッセージ
117行目の StreamWriter sw = new StreamWriter("test3.csv", true);の部分でグラフに一つ目をプロットした後にエラーメッセージが発生しました。
エラーメッセージ
System.IO.IOException: '別のプロセスで使用されているため、プロセスはファイルにアクセスできません
該当のソースコード
C#
1using System; 2using System.Collections.Generic; 3using System.Drawing; 4using System.Windows.Forms; 5using System.IO; 6using System.Windows.Forms.DataVisualization.Charting; 7 8namespace WindowsFormsApp3 9{ 10 11 public partial class Form1 : Form 12 { 13 private int i = 0; 14 15 //リストの作成 16 List<string> lists1 = new List<string>(); 17 List<string> lists2 = new List<string>(); 18 19 public Form1() 20 { 21 InitializeComponent(); 22 23 24 //貼り付けたChartコントロールには、初期値のデータがセットされているので、一旦クリアします 25 chart1.ChartAreas.Clear(); 26 chart1.Series.Clear(); 27 28 //「chartArea」という名前のエリアを生成します 29 ChartArea chartArea = new ChartArea("chartArea"); 30 31 //生成したエリアをChartコントロールに追加します 32 chart1.ChartAreas.Add(chartArea); 33 34 //Series(系列)を生成します 35 Series series1 = new Series(); 36 37 //系列の種類を指定 38 series1.ChartType = SeriesChartType.FastPoint; 39 40 //系列の凡例を設置します 41 series1.LegendText = "中心"; 42 43 //系列のポイント情報をセットします 44 45 series1.Points.AddXY(0, 0); 46 47 //生成・設定した系列をChartコントロールに追加します 48 chart1.Series.Add(series1); 49 50 51 //グラフの軸表示を設定します 52 chart1.ChartAreas[0].AxisX.Minimum = -10; 53 chart1.ChartAreas[0].AxisX.Maximum = 10; 54 chart1.ChartAreas[0].AxisY.Minimum = -1; 55 chart1.ChartAreas[0].AxisY.Maximum = 1; 56 //Y軸の間隔を決めます 57 chart1.ChartAreas[0].AxisY.Interval = 1; 58 chart1.ChartAreas[0].AxisX.Interval = 1; 59 60 //点の種類を決めます 61 series1.MarkerSize = 10; 62 63 //ラベルの非表示 64 chart1.ChartAreas[0].AxisX.LabelStyle.Enabled = false; 65 chart1.ChartAreas[0].AxisY.LabelStyle.Enabled = false; 66 chart1.ChartAreas[0].AxisX.MajorTickMark.Enabled = false; 67 68 //x軸・y軸の非表示 69 chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false; 70 chart1.ChartAreas[0].AxisY.MajorGrid.Enabled = false; 71 72 Series series2 = new Series(); 73 series2.ChartType = SeriesChartType.FastPoint; 74 series2.MarkerSize = 12; 75 76 //系列の凡例を設置します 77 series2.LegendText = "位置"; 78 79 //series2の点の色を指定 80 series2.Color = Color.FromArgb(255, 0, 0); 81 82 //生成・設定した系列をChartコントロールへ追加 83 chart1.Series.Add(series2); 84 85 86 87 //csvファイルを読み込む 88 using (StreamReader sr = new StreamReader(@"test1.csv")) 89 { 90 91 //配列からリストに格納する 92 while (!sr.EndOfStream) 93 { 94 // CSVファイルの一行を読み込む 95 string line = sr.ReadLine(); 96 // 読み込んだ一行をカンマ毎に分けて配列に格納する 97 string[] values = line.Split(','); 98 lists1.AddRange(values); 99 100 } 101 } 102 103 using (StreamReader sr2 = new StreamReader(@"test3.csv")) 104 { 105 //配列からリストに格納する 106 107 while (!sr2.EndOfStream) 108 { 109 // CSVファイルの一行を読み込む 110 string line = sr2.ReadLine(); 111 // 読み込んだ一行をカンマ毎に分けて配列に格納する 112 string[] values = line.Split(','); 113 lists2.AddRange(values); 114 115 } 116 } 117 118 119 120 //タイマーの開始 121 timer1.Start(); 122 123 //1秒感覚で表示を更新する 124 timer1.Interval = 1000; 125 126 timer1.Enabled = true; 127 } 128 129 //タイマー部分の動作設定 130 private void Timer1_Tick(object sender, EventArgs e) 131 { 132 //古い座標を削除する 133 if (i > 0) 134 { 135 chart1.Series[1].Points.RemoveAt(0); 136 } 137 138 using (StreamWriter sw = new StreamWriter("test3.csv", true)) 139 { 140 //次の座標に移動する 141 if (i < lists1.Count) 142 { 143 sw.WriteLine(i); 144 i++; 145 } 146 sw.Close(); 147 } 148 149 150 151 //系列のポイント情報を設定します 152 chart1.Series[1].Points.AddXY(int.Parse(lists1[i]) - int.Parse(lists2[i]), 0); 153 154 155 } 156 } 157} 158
試したこと
補足情報(FW/ツールのバージョンなど)
Visual Studio 2022を使用しています。
あなたの回答
tips
プレビュー