C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 日が変わった時のデータ保存方法


(過去ログ 179 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■102504 / inTopicNo.1)  日が変わった時のデータ保存方法
  
□投稿者/ MASA (1回)-(2023/11/10(Fri) 10:20:02)

分類:[.NET 全般] 

C# Windowsフォームアプリケーション .NET Framework


データ保存の方法で教えて下さい

今1秒毎にデータを日付の付いたファイルに書き込むようにしているのですが
日が変わった時にファイルの日付を変えて保存を続行したいのです
宜しくお願い致します

using System;
using System.IO;
using System.Windows.Forms;

namespace データ保存
{
    public partial class Form1 : Form
    {
        private DateTime startTime;
        private Timer timer;
        string currentDate = DateTime.Now.ToString("yyyyMd");

        private string filePath = @"C:\test\Data保存\" + DateTime.Now.ToString("yyyyMd") + ".csv";

        public Form1()
        {
            InitializeComponent();
        }

        private void btnStart1_Click(object sender, EventArgs e)
        {
            startTime = DateTime.UtcNow;
            
            timer = new Timer();
            timer.Interval = 1000; // 1秒
            timer.Tick += Timer_Tick;
            timer.Start();
        }

        private void btnStop1_Click(object sender, EventArgs e)
        {
            timer.Stop();  
        }

        private void Timer_Tick(object sender, EventArgs e)
        {
            string date1 = DateTime.Now.ToString("yyyy/M/d");
            string date2 = DateTime.Now.ToString("HH:mm:ss");

            string data1 = upperData.ToString();
            string data2 = lowerData.ToString();

            SaveDataToCSV(date1, date2, data1, data2);  
        }

        private void SaveDataToCSV(string date1, string date2, string data1,string data2)
        {
            try
            {
                using (StreamWriter sw = File.AppendText(filePath))
                {
                    sw.WriteLine($"{date1},{date2},{data1},{data2}");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.Message);
            }
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}

引用返信 編集キー/
■102505 / inTopicNo.2)  Re[1]: 日が変わった時のデータ保存方法
□投稿者/ WebSurfer (2795回)-(2023/11/10(Fri) 10:36:48)
No102504 (MASA さん) に返信

> private void Timer_Tick(object sender, EventArgs e)
> {
> string date1 = DateTime.Now.ToString("yyyy/M/d");
> string date2 = DateTime.Now.ToString("HH:mm:ss");
>
> string data1 = upperData.ToString();
> string data2 = lowerData.ToString();
>
> SaveDataToCSV(date1, date2, data1, data2);
> }

そこのところ、コンパイラも通らないのではないですか?

引用返信 編集キー/
■102509 / inTopicNo.3)  Re[1]: 日が変わった時のデータ保存方法
□投稿者/ furu (220回)-(2023/11/10(Fri) 12:52:07)
No102504 (MASA さん) に返信
> 今1秒毎にデータを日付の付いたファイルに書き込むようにしているのですが
> 日が変わった時にファイルの日付を変えて保存を続行したいのです
filePathの作成をFile.AppendTextの直前にするといいです。


    string filePath = @"C:\test\Data保存\" + DateTime.Now.ToString("yyyyMd") + ".csv";
    using (StreamWriter sw = File.AppendText(filePath))
    {
        sw.WriteLine($"{date1},{date2},{data1},{data2}");
    }

DateTime.Nowは刻々と変わるので日付と時刻を別々に取得すると不具合の元です。

    string date1 = DateTime.Now.ToString("yyyy/M/d");
    string date2 = DateTime.Now.ToString("HH:mm:ss");

例えばdate1とdate2の処理中に11/10から11/11に日付が変わると
date1は11/10の日付
date2は11/11の時刻になってしまいます。
DateTime.Nowを一旦変数に代入しましょう。

    DateTime dt = DateTime.Now;
    string date1 = dt.ToString("yyyy/M/d");
    string date2 = dt.ToString("HH:mm:ss");

引用返信 編集キー/
■102511 / inTopicNo.4)  Re[1]: 日が変わった時のデータ保存方法
□投稿者/ 魔界の仮面弁士 (3708回)-(2023/11/10(Fri) 13:58:46)
2023/11/10(Fri) 14:00:03 編集(投稿者)

追記:「@」を書き忘れてた

No102504 (MASA さん) に返信
> DateTime.Now.ToString("yyyyMd")

これだと、
 2024年1月23日
 2024年12月3日
の両方が "2024123" になりますよ。

せめて
 .ToString(@"yyyy\-M\-d") → 2024-1-23
 .ToString("yyyyMMdd") → 20240123
などにしておくべきでは。



さらに言えば、OS の地域設定が「和暦」モードだった場合、
yyyy は 2024 ではなく 06 を返すことになるので、
カルチャーを明示して変換するのがより望ましいです。
引用返信 編集キー/
■102515 / inTopicNo.5)  Re[2]: 日が変わった時のデータ保存方法
□投稿者/ MASA (2回)-(2023/11/10(Fri) 16:52:34)
魔界の仮面弁士 さん
WebSurferさん
furuさん
ありがとうございます
上記を踏まえてやってみます
引用返信 編集キー/
■102516 / inTopicNo.6)  Re[3]: 日が変わった時のデータ保存方法
□投稿者/ MASA (3回)-(2023/11/10(Fri) 17:29:52)
No102515 (MASA さん) に返信
> 魔界の仮面弁士 さん
> WebSurferさん
> furuさん


日付が変わった時点で新しいファイルを作りました。
ありがとうございます

もうひとつお聞きしたいのですが

日付のファイルを開いた状態でプログラムを走らすと

エラーのインフォメーションがいくつも出てしまいます
(別のプロセスで使用されているためファイルにアクセスできません)

この場合ファイルを閉じて下さいとメッセージボックスを出して
閉じたらスタート出来る様にしたいと思っています
宜しくお願い致します

引用返信 編集キー/
■102518 / inTopicNo.7)  Re[4]: 日が変わった時のデータ保存方法
□投稿者/ とっちゃん (794回)-(2023/11/10(Fri) 20:38:22)
No102516 (MASA さん) に返信
> もうひとつお聞きしたいのですが
>
> 日付のファイルを開いた状態でプログラムを走らすと
>
> エラーのインフォメーションがいくつも出てしまいます
> (別のプロセスで使用されているためファイルにアクセスできません)
>
> この場合ファイルを閉じて下さいとメッセージボックスを出して
> 閉じたらスタート出来る様にしたいと思っています

例外をキャッチしているところで、単に例外メッセージを出すだけではなく、それなりのメッセージにしておき

timer.Enabled = false;
MessageBox.Show( "以下の理由でファイルが開けません。\n"+ex.Message );
timer.Enabled = true;

というような感じで、一時的に止めてやればよいと思いますよ。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -