<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>davi</title>
    <link>https://seodavi.tistory.com/</link>
    <description>IT/컴퓨터</description>
    <language>ko</language>
    <pubDate>Wed, 12 Aug 2026 06:40:00 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>다빛빝</managingEditor>
    <item>
      <title>C# 폴더 권한 체크 방법</title>
      <link>https://seodavi.tistory.com/82</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백오피스 운영 중 발생한 오류로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAS 권한이 없는 직원이 NAS 에 파일 업로드하는 기능을 사용하여 오류가 발생했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAS 권한은 없다보니 이미지는 옮겨지지 않고, DB만 서비스 DB 로 업데이트되어 대참사가 발생했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더 권한을 미리 체크하는 로직을 추가하여 오류를 해결했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;샘플 코드는 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공통함수로 만들어서 사용하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 사용해보니 권한 체크 분기에서 걸리지는 않고 대부분 try catch 구문에서 예외가 발생해서 false로 리턴되네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1715632256184&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.IO;
using System.Security.AccessControl;

class Program
{
    static void Main()
    {
        string folderPath = &quot;경로\\폴더명&quot;; // 확인하려는 폴더의 경로로 수정하세요

        if (CheckFolderPermissions(folderPath))
        {
            Console.WriteLine(&quot;폴더에 쓰기 권한이 있습니다.&quot;);
        }
        else
        {
            Console.WriteLine(&quot;폴더에 쓰기 권한이 없거나 확인할 수 없습니다.&quot;);
        }
    }

    static bool CheckFolderPermissions(string folderPath)
    {
        try
        {
            DirectorySecurity directorySecurity = Directory.GetAccessControl(folderPath);
            AuthorizationRuleCollection rules = directorySecurity.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount));

            foreach (AuthorizationRule rule in rules)
            {
                FileSystemAccessRule fileSystemRule = rule as FileSystemAccessRule;
                
                if (fileSystemRule != null &amp;amp;&amp;amp; (fileSystemRule.FileSystemRights &amp;amp; FileSystemRights.WriteData) != 0)
                {
                    return true; // 쓰기 권한이 있는 경우
                }
            }

            return false; // 쓰기 권한이 없는 경우
        }
        catch (UnauthorizedAccessException)
        {
            return false; // 예외가 발생하면 권한이 없는 것으로 간주
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사합니다.&lt;/p&gt;</description>
      <category>C#</category>
      <author>다빛빝</author>
      <guid isPermaLink="true">https://seodavi.tistory.com/82</guid>
      <comments>https://seodavi.tistory.com/82#entry82comment</comments>
      <pubDate>Tue, 14 May 2024 05:33:54 +0900</pubDate>
    </item>
    <item>
      <title>C# 파일 확장자 타입 체크 시 실수</title>
      <link>https://seodavi.tistory.com/81</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외주 개발 인수 후 파일 업로드가 불가능하다는 CS를 받았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 타입만 업로드가 가능하도록 했는데, JPG 파일이 업로드가 안된다는 문제였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인해보니 파일의 확장자는 대문자 JPG인데, 확장자 체크는 소문자인 jpg로만 하고있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사소한 실수이지만 확장자 체크 시 소문자, 대문자로 변환 후 체크해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 소문자로 체크하는 샘플 코드입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1715631834269&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public static string GetImageTypeFromExtension(string imagePath)
    {
        string extension = Path.GetExtension(imagePath);
        if (string.IsNullOrEmpty(extension))
            return &quot;Unknown&quot;;

        switch (extension.ToLower()) // ToLower() 소문자로 받아서 체크
        {
            case &quot;.jpg&quot;:
            case &quot;.jpeg&quot;:
                return &quot;JPEG&quot;;
            case &quot;.png&quot;:
                return &quot;PNG&quot;;
            case &quot;.gif&quot;:
                return &quot;GIF&quot;;
            case &quot;.bmp&quot;:
                return &quot;BMP&quot;;
            default:
                return &quot;Unknown&quot;;
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;감사합니다.&lt;/p&gt;</description>
      <category>C#</category>
      <author>다빛빝</author>
      <guid isPermaLink="true">https://seodavi.tistory.com/81</guid>
      <comments>https://seodavi.tistory.com/81#entry81comment</comments>
      <pubDate>Tue, 14 May 2024 05:25:34 +0900</pubDate>
    </item>
    <item>
      <title>[MS SQL] OPENQUERY 8000자 제한</title>
      <link>https://seodavi.tistory.com/80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Server 에서 오픈쿼리 사용 시 8000자를 넘어가면 실행이 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오픈쿼리 특성 상 테이블변수를 사용하지 못하기에 WHERE 절에서 IN 으로 조회하게 되는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대상이 많아지면 8000자를 넘는일이 자주 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671224912636&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DECLARE @V_TABLE TABLE
(
	ORD_NO INT ,
	ORD_NAME VARCHAR(30)
)

DECLARE @QUERY NVARCHAR(MAX)
DECLARE @MULTI_ORD_NO NVARCHAR(MAX)


-- 1. 대상 테이블로 받을 때 행 별 콤마 추가
-- ex) 1,2,3
SELECT @MULTI_ORD_NO = STRING_AGG(CAST(ORD_NO AS NVARCHAR(MAX)), ',') FROM (SELECT ORD_NO FROM @V_TABLE) A

SET @QUERY = N'
SELECT 1 FROM A WHERE KEY IN ('+ @MULTI_ORD_NO +')
'

EXECUTE (@QUERY) AT LINKED_SERVER&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 STRING_AGG 할 때 꼭 NVARCHAR(MAX)로 캐스팅해서 써야 한다.&lt;/p&gt;</description>
      <category>MSSQL</category>
      <category>OPENQUERY 8000 character</category>
      <category>OPENQUERY LIMIT 8000</category>
      <category>OPENQUERY MAX 8000</category>
      <author>다빛빝</author>
      <guid isPermaLink="true">https://seodavi.tistory.com/80</guid>
      <comments>https://seodavi.tistory.com/80#entry80comment</comments>
      <pubDate>Sat, 17 Dec 2022 06:24:28 +0900</pubDate>
    </item>
    <item>
      <title>C# Winform 반짝이는 버튼 컨트롤 만들기</title>
      <link>https://seodavi.tistory.com/78</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타이머를 이용해서 간단하게 구현할수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저에게 필수 입력 항목을 강조할때 사용했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 코드 예제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이해가 안되시면 코드전체를 긁어서 사용하시면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1639914700911&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; private Timer mBlinkTimer = new Timer();
       private bool mStart = false;
​
       public Form1()
       {
           InitializeComponent();
       }
​
       Button btnBlink;
       Button btnRun;
​
       private void Form1_Load(object sender, EventArgs e)
       {
           this.Size = new Size(1000, 500);
​
           btnBlink = new Button();
           btnBlink.Size = new Size(300, 300);
           btnBlink.Location = new Point((this.Width - btnBlink.Size.Width) / 2, (this.Height - btnBlink.Size.Height) / 2);
           this.Controls.Add(btnBlink);
​
           btnRun = new Button();
           btnRun.Text = &quot;Start/Stop&quot;;
           btnRun.Size = new Size(100, 0);
           btnRun.Dock = DockStyle.Right;
           this.Controls.Add(btnRun);
​
           btnRun.Click += btnRun_Click;
​
           mBlinkTimer.Interval = 500;
           mBlinkTimer.Tick += BlinkTimer_Tick;
​
           btnBlink.BackColor = Color.Gainsboro;
       }
​
       private void BlinkTimer_Tick(object sender, EventArgs e)
       {
           if (mStart)
           {
               if (btnBlink.BackColor == Color.Gainsboro)
               {
                   btnBlink.BackColor = Color.Yellow;
               }
               else
               {
                   btnBlink.BackColor = Color.Gainsboro;
               }
           }
       }
​
       private void btnRun_Click(object sender, EventArgs e)
       {
           mBlinkTimer.Enabled = !mStart;
           mStart = !mStart;
       }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Timer Interval에 반짝일 속도를 설정하고&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Timer Tick 이벤트에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멤버 변수인 불린 start가 true 일때만 반짝이게 하는 코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot; data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;!-- 본문광고진짜 --&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot; data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
(adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;!-- 반응형 텍스트링크 --&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
(adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 결과&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IMHDn/btrodAxWyNg/1URq3bBKTtK9WGkystkIkK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IMHDn/btrodAxWyNg/1URq3bBKTtK9WGkystkIkK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IMHDn/btrodAxWyNg/1URq3bBKTtK9WGkystkIkK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/IMHDn/btrodAxWyNg/1URq3bBKTtK9WGkystkIkK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;281&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#</category>
      <author>다빛빝</author>
      <guid isPermaLink="true">https://seodavi.tistory.com/78</guid>
      <comments>https://seodavi.tistory.com/78#entry78comment</comments>
      <pubDate>Sun, 19 Dec 2021 20:56:48 +0900</pubDate>
    </item>
    <item>
      <title>c# Devexpress gridcontrol 특정 셀 버튼 표시 방법</title>
      <link>https://seodavi.tistory.com/76</link>
      <description>&lt;p style=&quot;text-align: center; line-height: 1.5;&quot; data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;!-- 본문광고진짜 --&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot; data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
(adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;!-- 반응형 텍스트링크 --&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
(adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 코드 예시&lt;/p&gt;
&lt;pre id=&quot;code_1639914158359&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;​
       private DataTable CreateDataTable()
       {
           DataTable dt = new DataTable();
​
           dt.Columns.Add(&quot;NUM&quot;, typeof(int));
           dt.Columns.Add(&quot;NAME&quot;, typeof(string));
           dt.Columns.Add(&quot;DESC&quot;, typeof(string));
​
           for(int i=1; i &amp;lt;= 10; i++)
           {
               var dr = dt.NewRow();
​
               dr[&quot;NUM&quot;] = i;
               dr[&quot;NAME&quot;] = i % 2 == 0 ? &quot;이름&quot; : null;
               dr[&quot;DESC&quot;] = &quot;&quot;;
​
               dt.Rows.Add(dr);
           }
​
           return dt;
       }
       
       private void Form1_Load(object sender, EventArgs e)
       {
           gridControl1.DataSource = CreateDataTable();
​
           gridView1.Columns[&quot;NAME&quot;].ShowButtonMode = DevExpress.XtraGrid.Views.Base.ShowButtonModeEnum.ShowAlways;
       }
​
     
​
       private void gridView1_CustomRowCellEdit(object sender, DevExpress.XtraGrid.Views.Grid.CustomRowCellEditEventArgs e)
       {
           RepositoryItemButtonEdit rbtnEdit = new RepositoryItemButtonEdit();
​
           if(e.Column.FieldName == &quot;NAME&quot;)
           {
               if(e.CellValue.ToString() == &quot;&quot;)
               {
                   e.RepositoryItem = rbtnEdit;
               }
           }
       }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CustomRowCellEdit 이벤트에서 표시하고 싶은 셀에 조건을 두어 RepositoryItem에 버튼을 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 실행 결과&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boQjt0/btroceh6qR8/Lku7pIyx3irTN2IuLt7NH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boQjt0/btroceh6qR8/Lku7pIyx3irTN2IuLt7NH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boQjt0/btroceh6qR8/Lku7pIyx3irTN2IuLt7NH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboQjt0%2Fbtroceh6qR8%2FLku7pIyx3irTN2IuLt7NH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;739&quot; height=&quot;331&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;331&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#</category>
      <author>다빛빝</author>
      <guid isPermaLink="true">https://seodavi.tistory.com/76</guid>
      <comments>https://seodavi.tistory.com/76#entry76comment</comments>
      <pubDate>Sun, 19 Dec 2021 20:46:57 +0900</pubDate>
    </item>
    <item>
      <title>[MS SQL] ORDER BY CASE 정렬 조건</title>
      <link>https://seodavi.tistory.com/71</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;span style=&quot;color: #212121;&quot;&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;b&gt;MS SQL ORDER BY 조건&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;프로그래밍시 정렬을 해도되지만&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;쿼리단계에서 ORDER BY CASE 문을 이용한 정렬 방법이다&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S0BUe/btq2pkJZzoE/kRKDcwaP5UCIi3GkcoWWV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S0BUe/btq2pkJZzoE/kRKDcwaP5UCIi3GkcoWWV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S0BUe/btq2pkJZzoE/kRKDcwaP5UCIi3GkcoWWV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS0BUe%2Fbtq2pkJZzoE%2FkRKDcwaP5UCIi3GkcoWWV0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;다음과 같은 테이블이 있을때&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;USER_ST 3, 2, 1, 4 로 정렬하려면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1618264736098&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM USERS
ORDER BY 
  CASE 
    WHEN USER_ST = 3 THEN 0 
	WHEN USER_ST = 2 THEN 1
	WHEN USER_ST = 1 THEN 3
	WHEN USER_ST = 4 THEN 4
	ELSE 99
  END ASC&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;위와 같이 CASE 를 사용하여 임의로 순서를 지정해주면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1618265053200&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM USERS
ORDER BY 
  CASE 
    WHEN USER_ST = 3 THEN 0 
	WHEN USER_ST = 2 THEN 1
	WHEN USER_ST = 1 THEN 3
	WHEN USER_ST = 4 THEN 4
	ELSE 99
  END ASC,
  CASE 
    WHEN USER_ID = 'PARK' THEN 0
	ELSE 1
  END ASC&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;위와 같이 &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CASE 문을 여러개 중복 사용하여 정렬도 가능하다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>MSSQL</category>
      <author>다빛빝</author>
      <guid isPermaLink="true">https://seodavi.tistory.com/71</guid>
      <comments>https://seodavi.tistory.com/71#entry71comment</comments>
      <pubDate>Tue, 13 Apr 2021 07:05:17 +0900</pubDate>
    </item>
    <item>
      <title>C# 폴더 파일 구분</title>
      <link>https://seodavi.tistory.com/70</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;span style=&quot;color: #212121;&quot;&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;b&gt;C# 디렉토리 파일 구분 방법&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;사내 시스템에서 사용자가 파일 업로드 시&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;업로드 파일을 압축해서 보관하다가 압축파일 다운 후 압축을 해제하도록 했는데&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;사용자가 USB STICK을 사용하다 보니 압축 해제 속도가 나오지 않아서&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;그냥 폴더 상태로 보관하도록 루틴을 변경했다.&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;그러다보니 기존 ZIP파일일때와 폴더일때 구분이 필요하게 되었다.&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1618262024216&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;            string path = &quot;Selected Path&quot;;

            FileAttributes attr = File.GetAttributes(path);
            if ((attr &amp;amp; FileAttributes.Directory) == FileAttributes.Directory)
            {
                //디렉토리(폴더)
            }
            else
            {
                //파일
            }&lt;/code&gt;&lt;/pre&gt;</description>
      <category>C#</category>
      <author>다빛빝</author>
      <guid isPermaLink="true">https://seodavi.tistory.com/70</guid>
      <comments>https://seodavi.tistory.com/70#entry70comment</comments>
      <pubDate>Tue, 13 Apr 2021 06:14:25 +0900</pubDate>
    </item>
    <item>
      <title>c# 숨김 폴더(디렉토리) 체크 방법</title>
      <link>https://seodavi.tistory.com/69</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;span style=&quot;color: #212121;&quot;&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;b&gt;C# 숨김 폴더 체크 방법&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;이번 작업 중에 이동식 드라이브를 연결하면&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;모든 디렉토리와 파일을 삭제해야하는데&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;이동식 드라이브 내부에 두가지 숨겨진 폴더가 있어서&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;예외처리가 필요했다.&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;숨김폴더 체크 예제&lt;/p&gt;
&lt;pre id=&quot;code_1618261554177&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.IO;

            string path = &quot;D:\\&quot;;

            DirectoryInfo dir = new DirectoryInfo(path);

            if((dir.Attributes &amp;amp; FileAttributes.Hidden) == FileAttributes.Hidden)
            {
                Console.WriteLine(&quot;숨김 폴더&quot;);
            }&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;저는 디렉토리 &amp;amp;파일 삭제 재귀 함수에&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;Hidden 이면 예외처리하게 사용&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#</category>
      <category>C# Check Hidden Dir</category>
      <author>다빛빝</author>
      <guid isPermaLink="true">https://seodavi.tistory.com/69</guid>
      <comments>https://seodavi.tistory.com/69#entry69comment</comments>
      <pubDate>Tue, 13 Apr 2021 06:08:31 +0900</pubDate>
    </item>
    <item>
      <title>QM6 배출가스 장치 점검등 수리 후기</title>
      <link>https://seodavi.tistory.com/68</link>
      <description>&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote class=&quot;tx-quote-tistory&quot;&gt;&lt;span style=&quot;color: #212121;&quot;&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;b&gt;QM6 배출가스 점검 등&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;결혼 후 6개월정도 차 없이 지내다가&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;없는 살림이지만 집안에 차 한대는 있어야 겠다 싶어서 큰 맘먹고 구매했었습니다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;​&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;전기차를 사고 싶었지만 와이프의 극구 반대로 SUV차량을 구매하게 되었고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;​&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span&gt;평소 출퇴근 거리가 짧고&amp;nbsp;&lt;/span&gt;가성비가 좋은 QM6 가솔린으로 구매했습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;​&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;원하던 차가 아니라 첫 새차지만 사실 애정이 가지는 않네요..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;!-- 본문광고진짜 --&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
(adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;!-- 반응형 텍스트링크 --&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
(adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; margin-left: 2em; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; margin-left: 2em; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; margin-left: 2em; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;b&gt;배출가스 점검등 발생 이유?&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;2년 4개월정도 운행하면서 잔고장 한번 없이 잘 타고 있었는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;​&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;갑자기 주행 중에 배출가스 장치 점검 등이 점등 되었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;​&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;열심히 구글링을 하고 동호회 카페도 확인해본 결과&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;​&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;주유구를 꽉 닫지 않았을때 점등 될 수 있다고 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;​&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;사실 점검등이 들어온날 주유를 했는데 주유구를 잠굴때 띠딕 소리 한번만나게&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;​&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;대충 닫았던 것 이 생각나서 여러번 다시 닫고&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;2주 정도 주행 하였으나 결국 점검등이 사라지지는 않았습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;!-- 본문광고진짜 --&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
(adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;!-- 반응형 텍스트링크 --&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
(adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-size: 24px;&quot;&gt;&lt;b&gt;센터 방문 후기&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;그동안 프로젝트가 바빠서 연차를 못 냈기에 점검도 받을 겸&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;​&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;월요일에&amp;nbsp;연차를 내고 오전 11시에 방문했습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;​&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;센터에 방문하니 접수하시는분도 주유구 꽉 닫았냐고 물어보시더라구요&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;​&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;꽉 닫았다고 말씀드리니, 점검이 필요하다고 하시고 쉬고 계시라고 하십니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;​&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;대기시간 포함해서 총 1시간 소요되었고, 센서 점검 후 이상 없다 하여 끝.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;어떤 문제가 있었다 오류다 등의 피드백이 없어서 조금 아쉽네요&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5; clear: none; float: none;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>etc</category>
      <author>다빛빝</author>
      <guid isPermaLink="true">https://seodavi.tistory.com/68</guid>
      <comments>https://seodavi.tistory.com/68#entry68comment</comments>
      <pubDate>Sun, 11 Apr 2021 10:42:59 +0900</pubDate>
    </item>
    <item>
      <title>C# Ionic zip 압축 및 압축해제 프로그레스바 구현(feat.한글)</title>
      <link>https://seodavi.tistory.com/66</link>
      <description>&lt;p&gt;최근 압축 및 압축해제를 구현해야해서 라이브러리를 찾아보던 중&lt;/p&gt;
&lt;p&gt;IONIC.ZIP 라이브러리를 사용하게 되었습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;522&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTxag6/btq0SF3RgRE/X5b0BDqO2EzzZWK4KfWpTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTxag6/btq0SF3RgRE/X5b0BDqO2EzzZWK4KfWpTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTxag6/btq0SF3RgRE/X5b0BDqO2EzzZWK4KfWpTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTxag6%2Fbtq0SF3RgRE%2FX5b0BDqO2EzzZWK4KfWpTk%2Fimg.png&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;522&quot; data-filename=&quot;blob&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;설치는 비주얼스튜디오 NuGet에서 Ionic으로 검색하면 설치할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예제는 선택한 폴더를 압축/압축해제 하는 예제 코드 입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. 압축&lt;/p&gt;
&lt;pre id=&quot;code_1616597980389&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        private void zipFolder()
        {
            string sSourcePath = tbLoadFolderPath.Text;
            string sTargetPath = tbSavePath.Text;

            try
            {
                using (ZipFile zip = new ZipFile())
                {
                    DirectoryInfo di = new DirectoryInfo(sSourcePath);
                    //프로그레스바 최대 값 (디렉토리내 모든 파일 수)
                    mMaximum += di.GetFiles(&quot;*.*&quot;, System.IO.SearchOption.AllDirectories).Count();

                    //프로그레스바 이벤트 설정
                    zip.SaveProgress += Zip_SaveProgress;


                    FileInfo[] infos = di.GetFiles(&quot;*.*&quot;, SearchOption.AllDirectories);

                    string[] files = new string[infos.Length];

                    for (int i = 0; i &amp;lt; infos.Length; i++)
                    {
                        files[i] = infos[i].FullName;
                    }

                    byte[] b = null;
                    string fileName = string.Empty;

                    foreach (string file in files)
                    {
                        fileName = file.Replace(sSourcePath, &quot;&quot;);

                        //기본 인코딩 타입으로 읽기
                        b = Encoding.Default.GetBytes(fileName);

                        // IBM437로 변환
                        fileName = Encoding.GetEncoding(&quot;IBM437&quot;).GetString(b);

                        zip.AddEntry(fileName, File.ReadAllBytes(file));
                    }

                    DirectoryInfo dir = new DirectoryInfo(sTargetPath);

                    if(!dir.Exists)
                    {
                        dir.Create();
                    }

                    string[] split = sSourcePath.Split('\\');

                    string sZipName = split[split.Length - 1];

                    zip.Save($&quot;{sTargetPath}\\{sZipName}.zip&quot;);
                }
                Process.Start(sTargetPath);
            }
            catch(Exception ex)
            {
                MessageBox.Show($&quot;{ex.Message}\r\n압축 실패&quot;);
                return;
            }
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. 압축 해제&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1616598016788&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;       private void unZipFile()
        {
            string sSourcePath = tbLoadZipPath.Text;
            string sTargetPath = tbSavePath.Text;

            try
            {
                using (ZipFile zip = ZipFile.Read(sSourcePath))
                {
                    FileInfo fi = new FileInfo(sSourcePath);

                    zip.ExtractProgress += Extract_Progress;

                    //프로그레스바 맥시멈 값
                    mMaximum = zip.Entries.Count;

                    DirectoryInfo dir = new DirectoryInfo(sTargetPath);

                    if (!dir.Exists)
                    {
                        dir.Create();
                    }

                    string saveFolderPath = $&quot;{sTargetPath}\\{Path.GetFileNameWithoutExtension(sSourcePath)}&quot;;

                    for (int i = 0; i &amp;lt; zip.Entries.Count; i++)
                    {
                        ZipEntry entry = zip[i];

                        //IBM437 인코딩
                        byte[] byteIbm437 = Encoding.GetEncoding(&quot;IBM437&quot;).GetBytes(zip[i].FileName);
                        //euckr 인코딩
                        string euckrFileName = Encoding.GetEncoding(&quot;euc-kr&quot;).GetString(byteIbm437);

                        zip[i].FileName = euckrFileName;

                        entry.Extract(saveFolderPath, ExtractExistingFileAction.OverwriteSilently);
                    }
                    Process.Start(saveFolderPath);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($&quot;{ex.Message}\r\n압축 해제 실패&quot;);
                return;
            }
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. 예제 소스 코드 파일&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 본문광고진짜 --&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
(adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 반응형 텍스트링크 --&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
(adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/vln9t/btq0ZLujYUP/qNVKPLCtveJWpZTYREhdgK/WindowsFormsApp3.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;WindowsFormsApp3.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.86MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;프로그레스바를 ionic.zip에서 지원하는 이벤트로만 구현했는데&lt;/p&gt;
&lt;p&gt;개인적으로 사용하실때에는 조금 손보는게 좋을 것 같습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예제 코드는 이전에 구글링한 자료에 집에서 생각나는것만 정리한 정도이니 참고만 하시면 될 것 같습니다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>C#</category>
      <category>c# IONIC ZIP</category>
      <category>c# 압축</category>
      <category>c# 압축 예제</category>
      <category>c# 압축 프로그레스바</category>
      <author>다빛빝</author>
      <guid isPermaLink="true">https://seodavi.tistory.com/66</guid>
      <comments>https://seodavi.tistory.com/66#entry66comment</comments>
      <pubDate>Thu, 25 Mar 2021 00:22:24 +0900</pubDate>
    </item>
  </channel>
</rss>