質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

6889閲覧

「別のプロセスで使用されているため、プロセスはファイルにアクセスできません。」というエラーが消えなくて困っています

Jim585

総合スコア15

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2019/12/17 10:37

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/12/17 11:32

150ms しか無いので、前回の書き込みが終わる前に開こうとしているのでしょう。 ファイルを開いたり閉じたりしていますが、ここにボトルネックがあるのではないかと思います。 タイマーをスタートする前に開き、開きっぱなしでやってみてください。
Jim585

2019/12/17 11:37

ありがとうございます! “タイマ間隔”に問題があったみたいです。 タイマーの種類を“System.Windows.Forms.Timer”に変えると上手くいきました 貴重なお時間を割いて頂き、本当にありがとうございました!
Zuishin

2019/12/17 11:38 編集

この解決法だと処理落ちが発生するのを報告しないだけですけど、それでいいんですか?
退会済みユーザー

退会済みユーザー

2019/12/17 11:43

質問と直接関係ないですが、条件次第でsw.Close()が2度呼ばれます。またusingを使用している場合そもそもsw.Close()を呼ぶ必要はありません(Disposeが呼ばれることで内部的にCloseの処理もしている模様) 読んでも問題は起きませんが、参考までに...
Jim585

2019/12/17 11:47

確かに、、、処理落ちしていることになりますね、、、 sw.Close()はどうしてもエラーが消えなかったので「絶対に閉めてやる!」という気持ちで入れていました。ありがとうございます!
guest

回答1

0

ベストアンサー

System.Timers.Timer は別スレッドでタイマイベントが実行されます
そのため、ファイル書き込みがタイマ間隔に間に合わない場合は、おっしゃるようなエラーが出ます

ここは、System.Windows.Forms.Timerを使えばどうでしょう
これならUIスレッドでしか動かないため、間に合わない場合でも大丈夫です

投稿2019/12/17 10:50

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Jim585

2019/12/17 11:33

timerの種類が問題だったとは、、、 無事、csvファイルへの出力が上手く出来るようになりました 本当にありがとうございました!!助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問