[CSharp] Zip 파일 압축, 해제

CSharp
참조할 어셈블리System.IO.CompressionSystem.IO.Compression.FileSystem // 압축 풀기 using (ZipArchive zipArchive = ZipFile.OpenRead(LOCAL_FILE)) { foreach (ZipArchiveEntry zipArchiveEntry in zipArchive.Entries) { try { string folderPath = Path.GetDirectoryName(Path.Combine(LOCAL_ZIPARCHIVE_PATH, zipArchiveEntry.FullName)); // if (!Directory.Exists(LOCAL_ZIPARCHIVE_PATH)) { Directory.CreateDirectory(LOCAL_ZIPARCHIVE_PATH); } // zipArchiveEntry.ExtractToFile(Path.Combine(LOCAL_ZIPARCHIVE_PATH, zipArchiveEntry.FullName), true); } catch (PathTooLongException pt_ex) { Console.WriteLine(pt_ex); } } } // 압축하기 using (FileStream fileStream = new FileStream(SFTP_DOWNLOAD_LOCAL_PATH, FileMode.Create, FileAccess.ReadWrite)) { using (ZipArchive zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Update)) { try { foreach (string filePath in Directory.EnumerateFiles(DOWNLOAD_LOCAL_ZIPARCHIVE_PATH, "*.*", SearchOption.AllDirectories)) { string relativePath = filePath.Substring(DOWNLOAD_LOCAL_ZIPARCHIVE_PATH.Length + 1); try { zipArchive.CreateEntryFromFile(filePath, relativePath); } catch (PathTooLongException pt_ex) { Console.WriteLine(pt_ex); } } } catch (Exception ex) { Console.WriteLine(ex); } finally { zipArchive.Dispose(); fileStream.Close(); } } } 단순하게 참조만 추가하니 정상적으로 되지 않아서 참조 방법을 조금더 자세히 기록을 합니다. 변경일 : 2021.06.19
Read More

[CSharp] SFTP

CSharp
ConnectionInfo ci = new ConnectionInfo(SFTP_HOST, SFTP_PORT, SFTP_USER, new PasswordAuthenticationMethod(SFTP_USER, SFTP_PASS)); using (var sftpClient = new SftpClient(ci)) { try { // sftpClient.KeepAliveInterval = TimeSpan.FromSeconds(60); sftpClient.ConnectionInfo.Timeout = TimeSpan.FromMinutes(180); sftpClient.OperationTimeout = TimeSpan.FromMinutes(180); sftpClient.Connect(); sftpClient.DeleteFile(SFTP_PATH); sftpClient.Disconnect(); // sftpClient.Connect(); sftpClient.BufferSize = 4 * 1024; using (FileStream fs = new FileStream(LOCAL_FILE, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { sftpClient.BufferSize = 4 * 1024; sftpClient.UploadFile(fs, FILE_NAME, true); } sftpClient.Disconnect(); // sftpClient.Connect(); sftpClient.DownloadFile(SFTP_DOWNLOAD_SERVER_PATH, LOCAL_FILE); sftpClient.Disconnect(); } catch (System.Net.Sockets.SocketException socket_ex) { MessageBox.Show(socket_ex.Message, "경고"); } catch (Renci.SshNet.Common.SshAuthenticationException ssh_ex) { MessageBox.Show(ssh_ex.Message, "경고"); } }
Read More

[CSharp] MySQL 접속 처리

CSharp, Database
using (dbConnection = new MySqlConnection("Server={0}Port={1};Database={2};Uid={3};Pwd={4}")) { try { /* INSERT, UPDATE 처리 */ dbConnection.Open(); dbQuery = string.Format("UPDATE `table` SET colume = '{0}' WHERE idx = '{1}'", VALUE, IDX); dbConnection.Open(); dbCmd = new MySqlCommand(dbQuery, dbConnection); dbCmd.ExecuteNonQuery(); dbConnection.Close(); /* bind 형식 */ dbConnection.Open(); dbQuery = "INSERT INTO log (`content`,`ip`,`creator`) VALUES (@content,@ip,@creator); "; dbCmd = new MySqlCommand(dbQuery, dbConnection); var bind1 = new MySqlParameter("@content", this.logString() + TEXT +"했습니다."); dbCmd.Parameters.Add(bind1); if( dbCmd.ExecuteNonQuery() == 1) { //성공 } dbConnection.Close(); /* SELECT */ dbConnection.Open(); dbQuery = string.Format("SELECT * FROM `table` WHERE idx = '{0}'; ", IDX); dbCmd = new MySqlCommand(dbQuery, dbConnection); dbTable = dbCmd.ExecuteReader(); if (dbTable.HasRows) { while (dbTable.Read()) { dbTable["cnt"].ToString().Trim(); } } } catch (MySqlException db_ex) { MessageBox.Show(db_ex.Message, "경고"); } finally { } } 그냥 소스코드의 일부 기능을 정리한 코드 입니다. 누군가가 바로 사용할 정도의 코드가…
Read More

[CSharp] datagirdivew 설정

CSharp
C#으로 개발을 하다 보면은 datagridview를 사용할 일이 너무 많아서 한번 기록을 해두기 위해서 글을 작성합니다. System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; dataGridViewCellStyle1.Font = new System.Drawing.Font("맑은 고딕", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(165))); dataGridViewCellStyle1.Padding = new System.Windows.Forms.Padding(0, 5, 0, 5); dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; //줄바꿈 this.dataGridViewFileList.Columns.Clear(); this.dataGridViewFileList.Rows.Clear(); this.dataGridViewFileList.Refresh(); this.dataGridViewFileList.BorderStyle = BorderStyle.None; this.dataGridViewFileList.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.None; this.dataGridViewFileList.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None; this.dataGridViewFileList.CellBorderStyle = DataGridViewCellBorderStyle.SingleHorizontal; this.dataGridViewFileList.BackgroundColor = Color.White; this.dataGridViewFileList.DefaultCellStyle.SelectionBackColor = Color.FromArgb(0, 161, 218);//선택시 this.dataGridViewFileList.DefaultCellStyle.SelectionForeColor = Color.White; //선택시 this.dataGridViewFileList.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue;//Color.FromArgb(236, 240, 241); this.dataGridViewFileList.ColumnHeadersDefaultCellStyle.BackColor = Color.FromArgb(228, 170, 102); this.dataGridViewFileList.ColumnHeadersDefaultCellStyle.ForeColor = Color.White; this.dataGridViewFileList.SelectionMode = DataGridViewSelectionMode.FullRowSelect; this.dataGridViewFileList.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None; this.dataGridViewFileList.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; this.dataGridViewFileList.DefaultCellStyle.WrapMode = DataGridViewTriState.True; //줄바꿈 this.dataGridViewFileList.Font = new System.Drawing.Font("맑은 고딕", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(165))); this.dataGridViewFileList.Visible = true; this.dataGridViewFileList.ReadOnly = true; this.dataGridViewFileList.MultiSelect = false; this.dataGridViewFileList.AutoGenerateColumns = false; this.dataGridViewFileList.RowHeadersVisible = false; this.dataGridViewFileList.ShowCellErrors = false; this.dataGridViewFileList.ShowCellToolTips = false; this.dataGridViewFileList.ShowEditingIcon = false; this.dataGridViewFileList.ShowRowErrors…
Read More

[C#] 파일 관리 Application

CSharp
회사에서 급하게 진행된 Application 입니다. Web서비스중에서 첨부파일에 대해서만 Application에서 관리를 하기 위해서 만들어진것입니다. web의 기능과 동일하게 작동을 해야 하는 부분에서 DB 분석을 해서 Web과 동일하게 작동을 하도록 만든점이 상당한 노력을 기울였습니다. 그외 부분은 파일 전송과 파일감시 기능은 Application의 고유 기능이라서 그다지 힘들었다기보다는 새로운 기술을 익히는 과정이라서 즐겁기까지 하였습니다. 해당 Application은 웹에 올린 파일을 Local에 다운받고 해당 파일의 변경 여부를 하여서 다시 Web Server에 올려주는 과정을 합니다. Up,Down 과정에서는 Web의 제약사항인 파일 사이즈의 문제를 해결 하기 위해서 SFTP 기능을 이용해서 파일을 Up,Down하도록 해서 대용량 파일이라도 Server에 올라가도록 하는 기능을 구현을 하였습니다. 또한, 압축된 파일을 자동적으로 압축해제 하고 파일을 볼 수 있도록 하면 그 파일중 1개라도 변경이되면은 다시 압축을 하는 과정도 거치게 되어 있어서 조금 복잡하게 변한 부분도 없지 않아 있지만, 사용자분들이 일단은 괜찮다는 평이 좋았습니다.
Read More

MySQL 엑셀로 산출물 만들기

CSharp, Database
문서를 작성해야 하는 일이 항상 있습니다. 그중에서 가장 귀찮은 일이 MySQL의 DB의 형식이나 현재 어떤 스키마를 가지고 있는지를 문서를 만드는 일이 정말 귀찮습니다. 물론 처음 문서를 작성하고 나서 큰 변화가 없다면은 다행이지만 항상 똑같은 상태라고 할 수가 없다 보니 매번 문서를 만들어야 하는 일이 정말 귀찮기만 할뿐입니다. 그렇다고 매번 Database에 들어가서 명령어를 실행하고 만드는것도 일입니다. 고정된 형태면 좋지만 다른 사람에게 공유하기 위해서로 문서로 만들어야 하는 일이 발생을 하게 되면은 또 다시 세팅하고 실행하고 결과값을 저장하는 일이 반복되는 일을 줄이는것이 가장 큰 목표였습니다. C#으로 만들다보니 엑셀 파일 만드는것이 가장 큰 일이였습니다. 내가 설치된 컴퓨터의 환경에 맞추면은 가장 좋지만은 프로그램이라 함은 어느정도 범용성을 가져야 하기에 엑셀로 출력하는 방식에서 많은 고민을 하였습니다. 물론 그전에 MySQL에서 정보를 빼 내는 로직 자체는 이미 완성되어 있어서 그래도 실행을 하면 되지만 마무리가 되지 않아서 한참을 헤메이다가 우연한…
Read More

업무기록 공유 및 기록

CSharp
팀원간에 메신저로만 하다보니 이후에 정리하기기 귀찮아서 져서 만들게 된것입니다. 보고를 위한 일이 되어 버렸지만 팀원간에 서로간에 무슨일을 하고 있는지 투명하게 공개를 하고 하루 하루 일지를 남기듯이 하도록 하였습니다. 일단 별다른 기능은 없으며 일일간 하여서 서로 공유 할수 있으면 ID, PASSWORD 설정으로 본인외에는 글을 수정 할 수 없도록 막아 놓은것입니다. 정말 간단하면서 서로 공유도 하고 팀원간에 서로간의 내용을 확인할수 있어서 좋다는 생각입니다. 물론 이것을 정리해야 되는 제 입장에서는 여기서 보고서 양식으로 출력하는 기능을 더 붙여야 하겠지만은 지금은 서로간에 공유 할 수 있도록 한것만으로 작지만 단순적인 일을 줄이게 되었습니다. 개발팀이 새롭게 꾸려지다 보니 이런 일이 현재는 정립이 되지 않았고 윗선에는 협업툴에 대해서 아직은 회의적이라서 만들게 된것입니다. 개인 개발자다보니 협업툴이 좋은것이 많지만 입맛에 맞는것도 없고 해서 이렇게 만들게 된것입니다. ps. 참고로 공개는 하지 않습니다.
Read More
Asterisk에서 인입콜 취득

Asterisk에서 인입콜 취득

CSharp
Asterisk IP-PBX 교환기를 사용하고 있는분께서 모든 전화를 받을수 없으셔서 인입되는 모든 Call 정보를 획득하는 방법을 문의 하셨고 만들게 되었습니다. 부가적인 기능으로 인입되는 DID 번호에 따라서 메모를 기록하고, SMS/LMS를 보내는 기능까지 함께 합쳐서 만들어진 기능입니다. 이렇게 하면서 상담원이 늘어나면서 이제 상담원에 대한 인증기능을 붙이게 되었으며, 발신번호를 변경가능하게 만들어지게 되었습니다. 정보를 취득후 서버에서 관리할수 있도록 하는 기록 서버가 있어서 모든 기록이 365일 24시간 계속 기록됩니다.
Read More

윈도우 응용프로그램에 전자서명을 해야 될듯…

CSharp
가끔식 주변분들에게 윈도우 응용프로그램을 만들어 드리는편입니다. 이전에는 그냥 배포라는 생각이 없어서 전자서명을 할 생각이 없었지만 조금씩 숫자가 늘어나면서 생각을 바뀌야 될듯 합니다. 공식적으로 불특정 다수에게 공개해서 사용하도록 하는 일을 만들지 않으려고 하는편입니다. 사용하는 기술이 한발을 잘못 디디면은 불법이라는 형식으로 갈 수 있어서 그렇게 좋은 형태는 아닙니다. 하지만, 프로그램이라는것은 사용하시는분이 불편해서 만들어 달라는것이지, 사용할 일이 없으면은 절대 만들 이유가 없다고 보기에 만들어 드리는 편입니다. 이렇게 만든게 시간이 조금씩 흐르니 하나하나 쌓여서 이제 몇개가 사용되는 편입니다. 그렇다 보니깐 이제 전자서명을 해서 윈도우에서 사용하는데 불편함을 조금 들어 드리기 위해서 해야 된다고 생각을 합니다. 업데이트 문제도 있고해서 짧지는 않지만 장기간을 보고 하다 보면은 언젠가 Microsoft에서도 크게 문제가 없다고 인정해주지 않을가 싶어서 전자 서명을 시도합니다. 사설 전자서명이라서 기간이 2040년까지 인데 앞으로 20년을 제가 이 일을 할지 여부를 알 수 없기에 기간은 넉넉하다도 보여져서 만들어서 사용하는…
Read More

C# 메모리 강제 회수

CSharp
GC.Collect()를 사용하였지만 정말 획기적으로 줄지 않아서 사용하게 되는것입니다. using System.Runtime.InteropServices; // [DllImportAttribute("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)] // private static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize); /// <summary> /// 강제 메모리 회수 /// </summary> public static void FlushMemory() { GC.Collect(); GC.WaitForPendingFinalizers(); if (Environment.OSVersion.Platform == PlatformID.Win32NT) { SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1); } } 남발을 할 경우 사용상에도 문제가 있고 하니, 적절히 필요한 부분에서 사용을 해야 될듯 싶습니다. 저 같은 경우은 datagridview를 몇개를 사용하다 보니 도저히 메모리 관리가 되지 않아서 지워준 경우가 됩니다. datagridview를 사용해서 표현은 하지만 Row 마다 수정은 막혀 있기도 하고 풀어 놓기도 해서 입니다. 수정 권한이 있는 사용자에게는 단순히 data를 보여주기만 하면 되어서 큰 문제가 없어서 메모리를 관리를 하는 용도로 사용을 합니다.
Read More

VisualStudio C# Debug창에 출력하기

CSharp
using System.Diagnostics; static class Program { static void Main() { Debug.WriteLine("메세지 내용"); } } 항상 사용을 할 수 있다는것은 알지만 기억이 나지 않아서 간단히 정리합니다. 평소에는 그냥 평하게 Console 창에 이용하기 때문에 사용할 수 있지만, 속성을 변경해야 하는 불편함도 있고 하여서 기록을 합니다. 이곳에 기록을 해 놓아도 기록여부를 기억하지 않으면 나중에 또 기억이 나지 않겠지만 일단 기록 입니다.
Read More
Visual Studio Installer Project 사용하기

Visual Studio Installer Project 사용하기

CSharp
확장 > 확장관리 :: 검색어 "installer"를 입력하면 설치 할 수 있습니다. Installer프로젝트의 자세한 사용법은 검색을 통해서 알아 보시기 바라며, 제가 기록할 내용은 설치할 경로에 대한 정보 입니다. 제가 이 사진을 올린 이유는 속성창중에서 "Manufacturer" 이부분이 중요해서 입니다. 아래의 사진중에서 경로를 지정할수 있습니다. 하지만, 이 프로그램이 설치될 상위 디렉토리에 대해서 설정을 여기서 할 수 있습니다.보이시는 "Manufacturer" 의 값이 아래의 "Application Folder"의 이름이 되는것이라고 저는 보고 있습니다. 경로를 설정하실때 이름을 입력을 해 놓는것이 좋다는 생각입니다. 보통 새롭게 프로젝트를 만들고 "Application Folder" 속성에 "DefaultLocation" 정보가 보이게 됩니다. 이곳의 정보를 수정하면은 변경을 할수 있습니다. // [ProgramFilesFolder] :: 설치할 경로 // [Manufacturer] :: 필수 유지 위에서 설명함. // [ProductName] :: 설치할 폴더명(프로젝트 이름과 달리 할수 있음) [ProgramFilesFolder][Manufacturer]\[ProductName] 위에서 "[ProgramFilesFolder]" 이부분을 변경을 원합니다. 저는 C 드라이버에 사용되기를 원해서 "[WindowsVolume][Manufacturer]\MyPROGRAM"으로 변경해서 모두 설치를 하고 있습니다. 저 처름…
Read More
MySQL DB Schema 관리 프로그램

MySQL DB Schema 관리 프로그램

CSharp, 프로그램
MySQL DB Schema 에 대해서 DBTool을 이용하지 않고 보고 보고서를 Excel로 출력하기 위해서 만들었습니다. 분명히 좋은 프로그램도 많고 하지만 특정 사용인에 맞춰서 출력을 조절하고 DB Schema를 관리 하기 위해서 만들게 되었습니다. 컬럼마다 코멘트와 형식으로 모두 설정이 가능하도록 되어 있어서 여러사람이 이 프로그램을 사용하면은 볼수가 있습니다.
Read More
Local MSSQL 데이터를 MySQL Server로 전송

Local MSSQL 데이터를 MySQL Server로 전송

CSharp, 프로그램
요구사항1. 컴퓨터의 MSSQL 특정 DB table을 MySQL 서버로 전송2. 특정컬럼의 구분자를 구분해서 MySQL로 전송3. 컴퓨터의 MSSQL 데이터를 일정기간 지난후 삭제 하도록 처리4. 프로그램의 실행 시간을 일정시간 간격으로 실행하다록 처리 매번 프로그램을 만들어주는게 간단한것도 있지만 막상 작업을 하다 보면은 손이 많이 가야 하는것이 있습니다. 이번 프로그램도 보기에는 간단한데, 내부적으로 돌아가야 하는 부분은 신경써야 할 곳이 한두곳이 아닙니다. Web API를 만들어서 전송하면은 WebServer에서 담당하면 되지만, 이건 IP가 지정되어서 MySQL 서버가 열러 있어서 해당 프로그램에서 자체적으로 MSSQL, MySQL를 동시에 처리해서 귀찮은 부분이 많았습니다. 일단 일정시간마다 읽어서 모든 Data를 전송하지만, 중복이 되지 않도록 제가 가능한 부분에서 최대한 노력을 하였으며, 현재 한달가 가동현황에서 보면은 문제는 없어 보입니다. 아울러 MSSQL의 데이터를 일정 기간만 유지하도록 Query 문을 사입해서 지우기도 하지 사용하시는분이 이제 편하다는 입장이며 저도 기분이 좋고 사용하시는 분도 좋으니 모든게 잘 풀린 케이스 인듯 합니다.
Read More
Local SQLite의 Table의 내용을 WebServer로 전송

Local SQLite의 Table의 내용을 WebServer로 전송

CSharp, 프로그램
필요사항1. 주기적으로 WebServer로 전송해야함.(단 WebServer에 중복은 방지)2. 각 컴퓨터마다 SQLite 경로가 다르기 때문에 설정이 가능하도록함.3. 각 컴퓨터 구분을 할 수 있도록 함.4. 각 컴퓨터에 일정시간적으로 DB를 읽을수 있도록함.5. 각 컴퓨터 SQLite DB가 Lock이 걸리니 복사해서 사용하도록함. 이상이 5가지 사항을 가지고 만든것이며, 약 일주일 정도 지났지만 문제없이 사용을 하고 있다고 합니다. 생각보다 적은 양의 코딩을 해서 만들었지만 알차게 만든듯 합니다.
Read More