WindowsアプリケーションをC#で作成している際に発生したエラーです。
作成した“data.csv”ファイルに値を3列書き込みたいと思っているのですが、「別のプロセスで使用されているため、プロセスはファイルにアクセスできません。」というエラーが出てしまいます。
自分的にはusing()もsw.close()も使っていてStreamWriter()で開いた“data.csv”ファイルはきちんと閉めれているの思うのですが、、、
*行おうとしているのはレプトリノの力覚センサからの値を入力してcsvファイルに軸ごとに値を出力することです。力覚センサからの値がしっかりととれていることは確認済みで、csvファイルへの出力は最初の30秒くらいは順調で、それ以降で書き込みのエラーが出るといった状況です。
訂正点・案をご教示いただきたいです。
どうかよろしくお願いいたします。
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using System.IO; 11using System.Threading; 12using System.Runtime.InteropServices; 13using System.Timers; 14using System.Diagnostics; 15 16namespace test 17{ 18 public partial class Form1 : Form 19 { 20 private System.Timers.Timer timer1;//センサー用 21 22 int cnt = 0; 23 double[] Data = new double[6]; 24 double[] Limit = new double[10]; 25 double Fx, Fy, Fz, Mx, My, Mz; //軸 26 27 char[] Status = new char[10]; 28 char[] SerialNo = new char[9]; 29 30 int portNo = 5; //ポート番号 31 32 //DLLのロード 33 [System.Runtime.InteropServices.DllImport("CfsUsb.dll")] 34 extern static void Initialize(); // DLLの初期化関数 35 [System.Runtime.InteropServices.DllImport("CfsUsb.dll")] 36 extern static void Finalize(); // DLLの終了処理 37 [System.Runtime.InteropServices.DllImport("CfsUsb.dll")] 38 extern static bool PortOpen(int pPortNo); // ポートオープン 39 [System.Runtime.InteropServices.DllImport("CfsUsb.dll")] 40 extern static void PortClose(int pPortNo); // ポートクローズ 41 42 [System.Runtime.InteropServices.DllImport("CfsUsb.dll")] 43 extern static bool GetSensorLimit(int pPortNo, double[] pData); // センサ定格確認 44 [System.Runtime.InteropServices.DllImport("CfsUsb.dll")] 45 extern static bool SetSerialMode(int pPortNo, bool pSet); // データの連続読込の開始/停止 46 47 [System.Runtime.InteropServices.DllImport("CfsUsb.dll")] 48 extern static bool GetSerialData(int pPortNo, double[] pData, char[] pStatus); // 連続データ読込み 49 50 [System.Runtime.InteropServices.DllImport("CfsUsb.dll")] 51 unsafe extern static bool GetLatestData(int pPortNo, double[] pData, char[] pStatus); // 最新データ読込 52 53 [System.Runtime.InteropServices.DllImport("CfsUsb.dll")] 54 extern static bool GetSensorInfo(int pPortNo, char[] psSerial); // シリアルNo取得 55 56 public Form1() 57 { 58 InitializeComponent(); 59 Initialize(); //DLLの初期化 60 } 61 62 //ポートオープン 63 private void Open_Click(object sender, EventArgs e) 64 { 65 //ポートオープン 66 if (PortOpen(portNo) == true) 67 { 68 //センサ定格確認 69 if (GetSensorLimit(portNo, Limit) == false) 70 { 71 Console.Out.WriteLine("センサ定格確認ができません。"); 72 } 73 74 if (GetSensorInfo(portNo, SerialNo) == false) 75 { 76 Console.Out.WriteLine("シリアルNoが取得できません。"); 77 } 78 } 79 else 80 { 81 Console.Out.WriteLine("回線がオープンできません。"); 82 } 83 } 84 85 //ポートクローズ 86 private void Close_Click(object sender, EventArgs e) 87 { 88 //ポートクローズ 89 PortClose(portNo); 90 91 //DLLの終了処理 92 Finalize(); 93 } 94 95 //センサ読み取りのタイマー作成 96 private void Sense_begin_Click(object sender, EventArgs e) 97 { 98 timer1 = new System.Timers.Timer(); 99 timer1.Interval = 150.0; 100 timer1.Elapsed += new ElapsedEventHandler(Timer1_Elapsed); 101 timer1.Start(); 102 } 103 104 //センサ取得終了 105 private void Sense_end_Click(object sender, EventArgs e) 106 { 107 //タイマー止め 108 timer1.Stop(); 109 } 110 111 //タイマーイベント 112 public void Timer1_Elapsed(object sender, EventArgs e) 113 { 114 Control.CheckForIllegalCrossThreadCalls = false; 115 116 var append = true; //書き込み方法指定 117 Encoding enc = Encoding.GetEncoding("shift_jis"); //文字コード指定 118 119 try 120 { 121 //このusingを読み込むタイミングでエラーが出ます 122 using (StreamWriter sw = new StreamWriter(@"data.csv", append, enc)) 123 { 124 if (cnt == 0) 125 { 126 //csvファイルの最初の1行目に測定開始時間を出力しています(ここでは何のエラーも出ないことは確認済みです) 127 sw.WriteLine("取得開始時間:" + "{0}", System.DateTime.Now); 128 } 129 if (GetLatestData(portNo, Data, Status) == true) 130 { 131 //センサからの値取得 132 Fx = Limit[0] / 10000 * Data[0]; // Fxの値 133 Fy = Limit[1] / 10000 * Data[1]; // Fyの値 134 Fz = Limit[2] / 10000 * Data[2]; // Fzの値 135 Mx = Limit[3] / 10000 * Data[3]; // Mxの値 136 My = Limit[4] / 10000 * Data[4]; // Myの値 137 Mz = Limit[5] / 10000 * Data[5]; 138 139 //csvファイルに書き込み 140 sw.WriteLine(Fx + "," + Fy + "," + Fz); 141 sw.Close(); 142 } 143 else 144 { 145 Console.Out.WriteLine("最新データ取得に失敗しました"); 146 } 147 sw.Close(); 148 } 149 cnt++; 150 } 151 152 catch (IOException exc) 153 { 154 MessageBox.Show("書き込み失敗しました", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); 155 Console.Out.WriteLine(exc.Message); 156 } 157 } 158 } 159}
回答1件
あなたの回答
tips
プレビュー