public void Build(string working_folder, string bin_data_filename, string namespace_name) { _working_folder = working_folder; _namespace_name = namespace_name; if (string.IsNullOrEmpty(bin_data_filename) == true) { bin_data_filename = $"excel_table_bin.bytes"; } // 엑셀 테이블 Raw 데이터 생성 var excel_tabale_builder = new ExcelTableBuild(); _table_raw_store = excel_tabale_builder.Build(working_folder); excel_tabale_builder.Dispose(); if (_table_raw_store == null) { Trace.WriteLine("엑셀 파일이 없거나 읽을 수 없습니다."); return; } // 기존 코드 로드 _loaded_assembly = LoadSourceCode(); // 키 업데이트 UpdateKeyStore(); // 소스 코드 갱신 GenerateSourceCode(); // 새로 생성된 코드 로드 _loaded_assembly = LoadSourceCode(); // 갱신된 프리파싱 파일 저장 var preparsed_file = new FileInfo(Path.Combine(working_folder, "preparsed.bin")); using (var bw = new BinaryWriter(preparsed_file.OpenWrite())) { byte[] preparsed_bytes = TableBinConverter.BinMaker(_table_raw_store); byte[] length_bytes = BitConverter.GetBytes(preparsed_bytes.Length); bw.Write(length_bytes, 0, length_bytes.Length); bw.Write(preparsed_bytes, 0, preparsed_bytes.Length); } // 테이블 데이터 생성 및 바이너리 저장 byte[] ts_bin = BuildTableStore(); var bin_data_file = new FileInfo(bin_data_filename); using (var bw = new BinaryWriter(bin_data_file.OpenWrite())) { byte[] ts_length_bytes = BitConverter.GetBytes((int)ts_bin.Length); bw.Write(ts_length_bytes, 0, ts_length_bytes.Length); bw.Write(ts_bin, 0, ts_bin.Length); } }
public TableRawDataStore Build(string build_path) { var bin_file = new FileInfo(Path.Combine(build_path, "preparsed.bin")); // 기존 바이너리 파일이 존재하는 경우 읽기 if (bin_file.Exists && bin_file.Length > 0) { using (var br = new BinaryReader(bin_file.OpenRead())) { int length = br.ReadInt32(); byte[] bin_bytes = br.ReadBytes(length); _table_raw_data_store = TableBinConverter.ClassMaker <TableRawDataStore>(bin_bytes); } } var start_time = DateTime.UtcNow; _excel_app = new Excel.Application(); _excel_app.Visible = false; _excel_app.DisplayAlerts = false; _excel_app.ScreenUpdating = false; try { var sha256 = new SHA256Managed(); string[] filepaths = Directory.GetFiles(build_path, "*.xlsx", SearchOption.AllDirectories); if (filepaths == null || filepaths.Length == 0) { return(null); } foreach (string filepath in filepaths) { if (File.GetAttributes(filepath).HasFlag(FileAttributes.Hidden)) { continue; } string filehash = ""; using (var stream = File.OpenRead(filepath)) { byte[] hashbytes = sha256.ComputeHash(stream); filehash = BitConverter.ToString(hashbytes).Replace("-", string.Empty); } string filename = Path.GetFileName(filepath); TableRawData raw_data = _table_raw_data_store.RawDataList.Find(x => x.FileName == filename); if (raw_data != null && !string.IsNullOrEmpty(raw_data.Hash)) { if (raw_data.Hash.Equals(filehash, StringComparison.OrdinalIgnoreCase)) { Trace.WriteLine($"Skipped (Hash Match)... {filename} ({filehash})"); continue; } else { var remove_list = _table_raw_data_store.RawDataList.Where(x => x.FileName == filename).ToList(); for (int i = 0; i < remove_list.Count; ++i) { _table_raw_data_store.RawDataList.Remove(remove_list[i]); Trace.WriteLine($"Removed preparsed... {remove_list[i].TableName}"); } } } Trace.WriteLine($"Parsing... {filename} ({filehash})"); Parse2(filepath, filename, filehash); } //using (var bw = new BinaryWriter(bin_file.OpenWrite())) //{ // byte[] preparsed_bytes = TableBinConverter.BinMaker(_table_raw_data_store); // byte[] length_bytes = BitConverter.GetBytes(preparsed_bytes.Length); // bw.Write(length_bytes, 0, length_bytes.Length); // bw.Write(preparsed_bytes, 0, preparsed_bytes.Length); //} Trace.WriteLine($"Parse Completed. {(DateTime.UtcNow - start_time).TotalMilliseconds} msec"); return(_table_raw_data_store); } finally { _excel_app.ScreenUpdating = true; _excel_app.Quit(); } }