[CSharp] Zip 파일 압축, 해제

CSharp
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(); } } }
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

ACTS 5.23

ACTS/SFCA
■ 프로그램 변경 내역 안내 Microsoft Edge 브라우저가 바로가기 실행이 되지 않는 문제 수정 ACTS 5.23 다운로드 링크는 더 이상 제공 되지 않습니다. 이후 패치가 새롭게 나올경우 제공됨을 알려드립니다. ■ 프로그램 안내사항 Visual Studio 2019로 컴파일되었기에 Windows XP에 대한 지원은 불가능합니다.다운로드 후에 압축 해제시에 안티바이러스(백신)에 의해 파일이 없을 수 있습니다. 안티바이러스(백신)에서 압축해제 시 파일을 삭제하는 것으로 알고 있습니다. 해당 문제는 사용자의 컴퓨터상의 압축 프로그램 또는 안티바이러스(백신)의 문제입니다. ■ 기타 문의 사항은 https://blog.truds.kr 에 남겨주시기 바랍니다.이전 버전은 다운로드를 제공하고 있지 않음을 알려드립니다.다운로드 제공은 일정 시간 이후에 제공하지 않음을 알려드립니다. 2020.12.28 다운로드 링크 제거
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

PHP 503에러 의도적으로 내기

PHP
<?php header('HTTP/1.1 503 Service Temporarily Unavailable'); header('Status: 503 Service Temporarily Unavailable'); header('Retry-After: 300');//300 seconds ?> PHP를 하면서 상태코드를 돌려줘야 할때가 있습니다. 그럴경우 파일은 있지만 접근권한을 제한하기 위한 코드가 필요해서 간단히 작성해 본것입니다. 503 코드로 돌려주기 때문에 서버의 기능이 잘못되었다고 판단을 하도록 하지만, 실제 이 파일은 그냥 모든것을 503으로 해서 접근을 하지 않았으면 해서 만든것입니다. 정상적인 코드로 사용하는것이 아니라서 잘못된것이지만, 무작위로 파일을 접속하는 봇에게 착각을 불러 일으켜서 이 파일은 정상적인 기능을 하지만 지금은 에러가 있다고 판단하게 해서 그냥 한곳으로 모을려고 만든 파일입니다. 그래서 아마 다른 형식으로 가져도 되지만, 이 코드를 사용하게 된것에 대해서 정확한 용도는 아니라는 점을 알려드립니다.
Read More

Synology에서 git pull 후 배포만 만들기

NAS
#!/bin/bash #날짜 date=$(date '+%Y%m%d') # 디렉토리 비우기 /usr/bin/rm -f /volume1/Distribute/table.tar.gz /usr/bin/rm -rf /volume1/Distribute/table/* # 디렉토리 복사 /usr/bin/cp -r /volume2/development/table/* /volume1/Distribute/table/ # Database sql dump /volume1/@appstore/MariaDB10/usr/local/mariadb10/bin/mysqldump -uUSER -pPASSWORD table > /volume1/Distribute/table/table.sql # 불필요 디렉토기 삭제 /usr/bin/rm -rf "/volume1/Distribute/table/_" /usr/bin/rm -rf "/volume1/Distribute/table/프로젝트" # 디렉토리 생성 /usr/bin/mkdir /volume1/Distribute/table/upload /usr/bin/chown user:users /volume1/Distribute/table/* /usr/bin/chmod 777 /volume1/Distribute/table/upload # 파일 압축 /usr/bin/tar -zcvf /volume1/Distribute/table.tar.gz /volume1/Distribute/table/*
Read More

Synology에서 쉘로 SVN update하기

NAS
쉘스크립트를 만드는 이유는 자동화를하기 위해서 입니다. 커멘트 모드에서 매번 실행을 하다 보면은 조금은 잊어 버릴때가많아서 스케쥴러에 걸어 놓으면은 상당히 편합니다. #!/bin/bash /usr/bin/svn checkout svn://URL/프로젝트명 /volume2/development/받을 경로/ 실 생활에서 사용하는것에 감춰야 할 부분을 감추고 정말 간단한 정보만을 표현을 한것입니다. 시놀로지 NAS에서 작업스케쥴을 걸면은 잊어 먹지 않고 바로 공개적으로 사용할수 있는 Public 웹이 만들어지기때문에 굳이 NAS에 들어가지 않아도 되는 이점이 존재 하는것입니다. 스케쥴러 캡쳐 화면 위에 화면 처럼 조금 빠르지만은 개발을 할 시간에 걸어 놓으면은 별도로 NAS에서 확인하지 않아도 바로 적용이 되고, 늦어도 커밋후 10분 이내에 바로 NAS Web에 적용이 되지 작업을 줄이는 일입니다. 처음에 이렇게 사용하게 된 이유가 제가 담당을 해서 매번 업데이트를 실행해야 되어서 퇴근전이나 큰 변경사항이 있다면은 매번 하다 보니 조금은 귀찮은 점을 해소하기 위해서 작업을 하게 된 것입니다. 프로그램을 만드는 사람이라면은 응당 자기가 귀찮은 일을 프로그램에게 맡겨서 처리할수…
Read More

업무기록 공유 및 기록

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

Synology 쉘스크립트 백업

NAS
#!/bin/bash #날짜 date=$(date '+%Y%m%d%H%M') NowDate=`date` # 기존 파일 삭제 /usr/bin/rm -f /volume1/web/backup/data/${date}.sql /usr/bin/rm -f /volume1/web/backup/data/${date}.tar.gz # 압축 backup 디렉토리, phpMyAdmin 디렉토리 제외 /usr/bin/tar -zcvf /volume1/web/backup/data/${date}.tar.gz /volume1/web/* --exclude /volume1/web/backup --exclude /volume1/web/phpMyAdmin # 압축파일 일정시간 지난후 삭제 /usr/bin/find /volume1/web/backup/data/ -name '*.tar.gz' -mtime 30 | xargs /usr/bin/rm -f #MySQL DB sql backup /volume1/@appstore/MariaDB10/usr/local/mariadb10/bin/mysqldump -u사용자 -p패스워드 데이터베이스 > /volume1/web/backup/data/${date}.sql #일정기간 경과 파일 삭제 /usr/bin/find /volume1/web/backup/data/ -name '*.sql' -mtime 30 | xargs /usr/bin/rm -f
Read More
팟플레어 광고 차단

팟플레어 광고 차단

Windows
설치시 언어를 한국어가 아닌 영문으로 하고 하는 방법이라고 합니다. 화면 캡쳐 위에 화면은 설치후에 언어를 변경하는 방식입니다. https://dssbblog.com/카카오-팟플레이어-광고제거-언어-변경-으로-차단-해/ 2020년 11월 1일 현재 제가 무엇을 잘못하였는지 위 방법으로는 현재 제대로 작동하지 않고 있어서 방법을 찾는중입니다. 뭔가 복잡한 작업을 하지 않고 팟플레이어 광고를 제거할 방법이 없는가 고민입니다.
Read More

Apache SSL 등급 확인

Linux, WWW
제가 운영하는 웹서버의 SSL 등급기 갑자기 궁금해져서 한번 테스트를 해보았습니다. 테스트에 사용된 사이트는 ssllabs.com 에 기능을 이용하였습니다. 아래에 링크를 첨부해 놓았습니다. https://www.ssllabs.com/ssltest/analyze.htm 결과는 좋게 A 등급이 나왔습니다. 서버에 사용하는 모든 버전이 업데이트 되면서 결과가 좋게 나온다고 생각은 하였지만 생각하는 부분과 결과를 눈으로 직접 보는것은 다른듯 합니다. 결과화면에 대한 캡쳐본 가끔식은 트렌드에 따라서 움직여야 하는 일이 있습니다. 특히 보안에 관련된 사항은 좀 더 많은 부분을 신경쓰고 현재 진형으로 가는 부분을 잘 적용하는것이 좋을듯 합니다. 위 결과 화면 아래에 더 많은 정보가 있지만 캡쳐를 할 이유가 없어서 위에 가장 중요한 화면만 캡쳐만 한것입니다.
Read More

리눅스 디스크 사용량 확인

Linux
리눅스에서 디스크 사용량에 대해서 확인하는 명령어 입니다. 간단하게 'df'로 해서 처리를 할 수 있지만 다른 부분에 대해서도 확인 가능한 명령어입니다. df df -P 전체용량 # KB단위 df -P | grep -v ^Filesystem | awk '{sum += $2} END { print sum " KB" }' # GB 단위 df -P | grep -v ^Filesystem | awk '{sum += $2} END { print sum/1024/1024 " GB" }' 전체 사용량 # KB 단위 df -P | grep -v ^Filesystem | awk '{sum += $3} END { print sum " KB" }' # GB 단위 df -P | grep -v ^Filesystem | awk '{sum += $3} END { print sum/1024/1024 " GB" }' 전체 남은 용량 # KB단위 df -P | grep -v ^Filesystem | awk '{sum += $4} END { print sum "…
Read More