347 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			347 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Collections.Generic;
 | |
| using System;
 | |
| using System.Drawing;
 | |
| using System.Diagnostics;
 | |
| using System.Data;
 | |
| using System.Collections;
 | |
| using System.Windows.Forms;
 | |
| using System.IO;
 | |
| using System.Text;
 | |
| using AR;
 | |
| 
 | |
| namespace vmsnet
 | |
| {
 | |
|     public class CFDB
 | |
|     {
 | |
|         string _BaseDir;
 | |
| 
 | |
|         System.Text.StringBuilder[] StrBuf; ////데이터버퍼
 | |
|         DateTime[] LastTime; ////데이터시간
 | |
|         System.IO.FileInfo[] File; ////데이터파일정보
 | |
|         int MaxCount = 10;
 | |
|         public bool IsReady { get; private set; }
 | |
| 
 | |
|         public CFDB(params string[] dirarrays)
 | |
|         {
 | |
|             var dir = System.IO.Path.Combine(dirarrays);
 | |
|             _BaseDir = dir;
 | |
| 
 | |
|             StrBuf = new System.Text.StringBuilder[MaxCount];
 | |
|             LastTime = new DateTime[MaxCount];
 | |
|             File = new System.IO.FileInfo[MaxCount];
 | |
| 
 | |
|             if (System.IO.Directory.Exists(_BaseDir) == false)
 | |
|             {
 | |
| 
 | |
|                 try
 | |
|                 {
 | |
| 
 | |
|                     System.IO.Directory.CreateDirectory(_BaseDir);
 | |
|                     IsReady = true;
 | |
|                 }
 | |
|                 catch
 | |
|                 {
 | |
|                     IsReady = false;
 | |
|                 }
 | |
| 
 | |
|             }
 | |
|             else IsReady = true;
 | |
| 
 | |
| 
 | |
|             ////Data Initialize
 | |
|             for (int i = 0; i < MaxCount; i++)
 | |
|             {
 | |
|                 StrBuf[i] = new System.Text.StringBuilder();
 | |
|                 LastTime[i] = DateTime.Now;
 | |
|                 File[i] = null;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         ////지정한 기간내 파일의 존재여부를 확인합니다.
 | |
|         //public int GetfileCount(string table, DateTime sd, DateTime ed)
 | |
|         //{
 | |
|         //	return GetfileS(table, sd, ed).Count;
 | |
|         //}
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 데이터를 기록합니다.
 | |
|         /// </summary>
 | |
|         /// <param name="time">기록시간(파일명이 결정됨)</param>
 | |
|         /// <param name="table">기록할테이블명(파일명)</param>
 | |
|         /// <param name="buffer">기록할데이터(열데이터가 틀려서 고정할 수 없다)</param>
 | |
|         /// <returns></returns>
 | |
|         /// <remarks></remarks>
 | |
|         public bool InsertData(DateTime time, string table, StringBuilder buffers)
 | |
|         {
 | |
|             string DayStr = time.ToString("yyyyMMdd");
 | |
|             byte TableIndex = byte.Parse(table.Substring(5));
 | |
| 
 | |
|             ////해당데이터의 시간과 파일정보를 기록
 | |
|             LastTime[TableIndex - 1] = time;
 | |
|             File[TableIndex - 1] = new System.IO.FileInfo(_BaseDir + "\\" + DayStr.Substring(0, 4) + "\\" + DayStr.Substring(4, 2) + "\\" + DayStr.Substring(6) + "\\" + (time.Hour ).ToString("00") + "_" + table + ".txt");
 | |
|             if (!File[TableIndex - 1].Directory.Exists)
 | |
|                 File[TableIndex - 1].Directory.Create();
 | |
| 
 | |
|             ////각테이블별로 시작 열번호를 넣는다.
 | |
|             int si = 1 + 160 * (TableIndex - 1);
 | |
|             int ei = si + (160 - 1);
 | |
| 
 | |
|             ////파일이 없다면 제목줄을 생성해준다.
 | |
|             if (!File[TableIndex - 1].Exists)
 | |
|             {
 | |
|                 ////헤더를 추가해야한다.
 | |
|                 var Header = new System.Text.StringBuilder();
 | |
|                 Header.Append("\t" + "TIME");
 | |
|                 for (int j = si; j <= ei; j++)
 | |
|                 {
 | |
|                     Header.Append("\t" + "C" + j.ToString("000"));
 | |
|                 }
 | |
|                 //Header.Append(vbTab + "KA")
 | |
|                 Header.AppendLine(); ////제목줄을 한칸띄운다
 | |
| 				
 | |
| 				//File[TableIndex - 1].WriteText(Header);   // 이전 단독모드
 | |
| 				/* 작성자: 이재웅, 작성일: 2024-09-23, 작성내용: 접근모드를 공유모드로 전환 */
 | |
| 				using (FileStream fs = new FileStream(File[TableIndex - 1].FullName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite))
 | |
| 				using (StreamWriter writer = new StreamWriter(fs))
 | |
| 				{ writer.Write(Header.ToString()); }				
 | |
|             }
 | |
| 
 | |
|             StrBuf[TableIndex - 1].AppendLine("\t" + time.ToFileTime().ToString() + buffers.ToString());
 | |
| 
 | |
|             ////4kb 단위로 파일을 기록한다.
 | |
|             if (StrBuf[TableIndex - 1].Length > 4096) ////실제파일 기록은 5초마다 한다.
 | |
|             {
 | |
|                 //File[TableIndex - 1].AppendText(StrBuf[TableIndex - 1]);  // 이전은 단독모드
 | |
|                 /* 작성자: 이재웅, 작성일: 2024-09-23, 작성내용: 접근모드를 공유모드로 전환 */
 | |
|                 using (FileStream fs = new FileStream(File[TableIndex - 1].FullName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
 | |
|                 using (StreamWriter writer = new StreamWriter(fs))
 | |
|                 { writer.Write(StrBuf[TableIndex - 1].ToString()); }				
 | |
| 				
 | |
|                 StrBuf[TableIndex - 1].Clear();
 | |
|             }
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         ~CFDB()
 | |
|         {
 | |
|             ////버퍼에 남아잇는 데이터를 기록한다.
 | |
|             for (int i = 0; i < MaxCount; i++)
 | |
|             {
 | |
|                 if (StrBuf[i].Length > 0)
 | |
|                 {
 | |
|                     try
 | |
|                     {
 | |
|                         using (var writer = new StreamWriter(File[i].FullName, true, System.Text.Encoding.Default))
 | |
|                             writer.Write(StrBuf[i].ToString());//
 | |
|                     }
 | |
|                     catch { }
 | |
|                 }
 | |
|                 StrBuf[i].Clear();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 저장폴더내에 존재하는 날짜정보를 반환합니다.
 | |
|         /// </summary>
 | |
|         /// <returns></returns>
 | |
|         /// <remarks></remarks>
 | |
|         //public List<string> GetDateList()
 | |
|         //{
 | |
|         //	List<string> REtval = new List<string>();
 | |
| 
 | |
|         //	System.IO.DirectoryInfo BDI = new System.IO.DirectoryInfo(_BaseDir);
 | |
|         //	foreach (System.IO.DirectoryInfo Fd_Year in BDI.GetDirectories())
 | |
|         //	{
 | |
|         //		foreach (System.IO.DirectoryInfo FD_Mon in Fd_Year.GetDirectories())
 | |
|         //		{
 | |
|         //			foreach (System.IO.DirectoryInfo Fd_Day in FD_Mon.GetDirectories())
 | |
|         //			{
 | |
|         //				if (Fd_Day.GetFiles().Length > 0)
 | |
|         //				{
 | |
|         //					REtval.Add(Fd_Year.Name + FD_Mon.Name + Fd_Day.Name);
 | |
|         //				}
 | |
|         //			}
 | |
|         //		}
 | |
|         //	}
 | |
|         //	REtval.Sort();
 | |
|         //	return REtval;
 | |
|         //}
 | |
| 
 | |
|         //public enum eTableList
 | |
|         //{
 | |
|         //	DATAB1 = 1,
 | |
|         //	DATAB2 = 2,
 | |
|         //	DATAB3 = 3,
 | |
|         //	DATAB4 = 4,
 | |
|         //	DATAB5 = 5
 | |
|         //}
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 저장폴더내에 존재하는 날짜정보를 반환합니다.
 | |
|         /// </summary>
 | |
|         /// <param name="tablename">찾고자하는테이블명(파일은 시_테이블명.txt로 되어있다.</param>
 | |
|         /// <returns></returns>
 | |
|         /// <remarks></remarks>
 | |
|         //public List<string> GetDateList(eTableList tablename)
 | |
|         //{
 | |
|         //	List<string> REtval = new List<string>();
 | |
| 
 | |
|         //	System.IO.DirectoryInfo BDI = new System.IO.DirectoryInfo(_BaseDir);
 | |
|         //	foreach (System.IO.DirectoryInfo Fd_Year in BDI.GetDirectories())
 | |
|         //	{
 | |
|         //		foreach (System.IO.DirectoryInfo FD_Mon in Fd_Year.GetDirectories())
 | |
|         //		{
 | |
|         //			foreach (System.IO.DirectoryInfo Fd_Day in FD_Mon.GetDirectories())
 | |
|         //			{
 | |
|         //				if (Fd_Day.GetFiles("*_" + tablename.ToString() +".txt").Length > 0)
 | |
|         //				{
 | |
|         //					REtval.Add(Fd_Year.Name + FD_Mon.Name + Fd_Day.Name);
 | |
|         //				}
 | |
|         //			}
 | |
|         //		}
 | |
|         //	}
 | |
|         //	REtval.Sort();
 | |
|         //	return REtval;
 | |
|         //}
 | |
| 
 | |
|         public List<(int Year, int Month)> GetAvailableDates()
 | |
|         {
 | |
|             var availableDates = new List<(int Year, int Month)>();
 | |
| 
 | |
|             if (!Directory.Exists(_BaseDir))
 | |
|                 return availableDates;
 | |
| 
 | |
|             // Get all year directories
 | |
|             foreach (var yearDir in Directory.GetDirectories(_BaseDir))
 | |
|             {
 | |
|                 if (int.TryParse(Path.GetFileName(yearDir), out int year))
 | |
|                 {
 | |
|                     // Get all month directories within the year directory
 | |
|                     foreach (var monthDir in Directory.GetDirectories(yearDir))
 | |
|                     {
 | |
|                         if (int.TryParse(Path.GetFileName(monthDir), out int month))
 | |
|                         {
 | |
|                             availableDates.Add((year, month));
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return availableDates;
 | |
|         }
 | |
| 
 | |
|         ////기간내 존재하는 파일을 반환합니다(테이블단위)
 | |
|         public List<string> GetfileS(string table, DateTime sd, DateTime ed)
 | |
|         {
 | |
|             List<string> REtval = new List<string>();
 | |
|             int SttYear = sd.Year;
 | |
|             int EndYear = ed.Year;
 | |
|             if (EndYear < SttYear) return REtval;
 | |
| 
 | |
|             int SttMonth = sd.Month;
 | |
|             int EndMonth = ed.Month;
 | |
| 
 | |
|             int SttDay = sd.Day;
 | |
|             int EndDay = ed.Day;
 | |
| 
 | |
|             int si = int.Parse(sd.ToString("yyyyMMdd"));
 | |
|             int ei = int.Parse(ed.ToString("yyyyMMdd"));
 | |
|             bool SameDay = si == ei ? true : false;
 | |
| 
 | |
|             //for (int dayinfo = si; dayinfo <= ei; dayinfo++)
 | |
|             //{
 | |
|             //    string dayStr = dayinfo.ToString();
 | |
|             //    string dirname = Path.Combine(_BaseDir, dayStr.Substring(0, 4), dayStr.Substring(4, 2), dayStr.Substring(6));
 | |
|             //    var dir = new DirectoryInfo(dirname);
 | |
|             //    if (!dir.Exists) continue;
 | |
| 
 | |
|             //    int startHour = (dayinfo == si) ? int.Parse(sd.ToString("HH")) : 0;
 | |
|             //    int endHour = (dayinfo == ei) ? int.Parse(ed.ToString("HH")) : 23;
 | |
| 
 | |
|             //    // 동일 날짜인 경우
 | |
|             //    if (SameDay)
 | |
|             //    {
 | |
|             //        startHour = int.Parse(sd.ToString("HH"));
 | |
|             //        endHour = int.Parse(ed.ToString("HH"));
 | |
|             //    }
 | |
| 
 | |
|             //    for (int hourinfo = startHour; hourinfo <= endHour; hourinfo++)
 | |
|             //    {
 | |
|             //        string filename = Path.Combine(dir.FullName, $"{hourinfo:00}_{table}.txt");
 | |
|             //        if (System.IO.File.Exists(filename))
 | |
|             //        {
 | |
|             //            REtval.Add(filename);
 | |
|             //        }
 | |
|             //    }
 | |
|             //}
 | |
| 
 | |
| 
 | |
|             ////20140101
 | |
|             for (int dayinfo = si; dayinfo <= ei; dayinfo++)
 | |
|             {
 | |
|                 string DayStr = dayinfo.ToString();
 | |
| 
 | |
|                 // Ex) dirname = ..\bin\Debug\Database\volt\2024\09\01
 | |
|                 var dirname = Path.Combine(_BaseDir, DayStr.Substring(0, 4), DayStr.Substring(4, 2), DayStr.Substring(6));
 | |
|                 var dir = new System.IO.DirectoryInfo(dirname);
 | |
|                 if (!dir.Exists) continue;
 | |
| 
 | |
|                 ////폴더가 존재하므로 해당 테이블파일이 존재하는지 확인한다
 | |
|                 if (SameDay)
 | |
|                 {
 | |
|                     ////동일날짜라면 해당 시간대만 조회하면됨
 | |
|                     for (int hourinfo = int.Parse(sd.ToString("HH")); hourinfo <= int.Parse(ed.ToString("HH")); hourinfo++)
 | |
|                     {
 | |
|                         string fn = dir.FullName + "\\" + (hourinfo).ToString("00") + "_" + table + ".txt";
 | |
|                         if (System.IO.File.Exists(fn))
 | |
|                             REtval.Add(fn);
 | |
|                     }
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     if (dayinfo == si) ////시작일이라면 시작시간부터 24시까지 이다.
 | |
|                     {
 | |
|                         for (int hourinfo = int.Parse(sd.ToString("HH")); hourinfo <= 23; hourinfo++)
 | |
|                         {
 | |
|                             string fn = dir.FullName + "\\" + (hourinfo).ToString("00") + "_" + table + ".txt";
 | |
|                             if (System.IO.File.Exists(fn))
 | |
|                                 REtval.Add(fn);
 | |
|                         }
 | |
|                     }
 | |
|                     else if (dayinfo == ei) ////종료일이라면 1~ 종료시까지이다.
 | |
|                     {
 | |
|                         for (int hourinfo = 0; hourinfo <= int.Parse(ed.ToString("HH")); hourinfo++)
 | |
|                         {
 | |
|                             string fn = dir.FullName + "\\" + (hourinfo).ToString("00") + "_" + table + ".txt";
 | |
|                             if (System.IO.File.Exists(fn))
 | |
|                                 REtval.Add(fn);
 | |
|                         }
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         ////중간에 끼어있는 날짜라면 1~24모두가 속한다.
 | |
|                         for (int hourinfo = 0; hourinfo <= 23; hourinfo++)
 | |
|                         {
 | |
|                             /* 주석일: 2024-09-20 | 주석내용: 파일명 설명 | 주석자: 이재웅
 | |
|                              * 
 | |
|                              * 파일명이 '08_DATAB1.txt'라면
 | |
|                              * 08 : 시간
 | |
|                              * _DATAB : 고정값
 | |
|                              * 1 : 채널
 | |
|                              */
 | |
|                             string fn = dir.FullName + "\\" + (hourinfo).ToString("00") + "_" + table + ".txt";
 | |
|                             if (System.IO.File.Exists(fn))
 | |
|                                 REtval.Add(fn);
 | |
|                         }
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             REtval.Sort();
 | |
|             return REtval;
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
| }
 | 
