반응형

 

백오피스 운영 중 발생한 오류로

NAS 권한이 없는 직원이 NAS 에 파일 업로드하는 기능을 사용하여 오류가 발생했습니다.

NAS 권한은 없다보니 이미지는 옮겨지지 않고, DB만 서비스 DB 로 업데이트되어 대참사가 발생했습니다.

 

폴더 권한을 미리 체크하는 로직을 추가하여 오류를 해결했습니다.

샘플 코드는 아래와 같습니다.

 

공통함수로 만들어서 사용하였습니다.

실제 사용해보니 권한 체크 분기에서 걸리지는 않고 대부분 try catch 구문에서 예외가 발생해서 false로 리턴되네요.

 

using System;
using System.IO;
using System.Security.AccessControl;

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

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

    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 && (fileSystemRule.FileSystemRights & FileSystemRights.WriteData) != 0)
                {
                    return true; // 쓰기 권한이 있는 경우
                }
            }

            return false; // 쓰기 권한이 없는 경우
        }
        catch (UnauthorizedAccessException)
        {
            return false; // 예외가 발생하면 권한이 없는 것으로 간주
        }
    }
}

 

 

감사합니다.

반응형
반응형

 

외주 개발 인수 후 파일 업로드가 불가능하다는 CS를 받았습니다.

 

이미지 타입만 업로드가 가능하도록 했는데, JPG 파일이 업로드가 안된다는 문제였습니다.

 

확인해보니 파일의 확장자는 대문자 JPG인데, 확장자 체크는 소문자인 jpg로만 하고있었습니다.

 

사소한 실수이지만 확장자 체크 시 소문자, 대문자로 변환 후 체크해야합니다.

 

아래는 소문자로 체크하는 샘플 코드입니다.

    public static string GetImageTypeFromExtension(string imagePath)
    {
        string extension = Path.GetExtension(imagePath);
        if (string.IsNullOrEmpty(extension))
            return "Unknown";

        switch (extension.ToLower()) // ToLower() 소문자로 받아서 체크
        {
            case ".jpg":
            case ".jpeg":
                return "JPEG";
            case ".png":
                return "PNG";
            case ".gif":
                return "GIF";
            case ".bmp":
                return "BMP";
            default:
                return "Unknown";
        }
    }

 

감사합니다.

반응형
반응형

 

타이머를 이용해서 간단하게 구현할수 있습니다.

 

유저에게 필수 입력 항목을 강조할때 사용했습니다.

 

1) 코드 예제

 

이해가 안되시면 코드전체를 긁어서 사용하시면 됩니다.

 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 = "Start/Stop";
           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;
       }

Timer Interval에 반짝일 속도를 설정하고 

Timer Tick 이벤트에서

멤버 변수인 불린 start가 true 일때만 반짝이게 하는 코드입니다.

 

 

 

2) 결과

 

반응형
반응형

 

 

1. 코드 예시

​
       private DataTable CreateDataTable()
       {
           DataTable dt = new DataTable();
​
           dt.Columns.Add("NUM", typeof(int));
           dt.Columns.Add("NAME", typeof(string));
           dt.Columns.Add("DESC", typeof(string));
​
           for(int i=1; i <= 10; i++)
           {
               var dr = dt.NewRow();
​
               dr["NUM"] = i;
               dr["NAME"] = i % 2 == 0 ? "이름" : null;
               dr["DESC"] = "";
​
               dt.Rows.Add(dr);
           }
​
           return dt;
       }
       
       private void Form1_Load(object sender, EventArgs e)
       {
           gridControl1.DataSource = CreateDataTable();
​
           gridView1.Columns["NAME"].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 == "NAME")
           {
               if(e.CellValue.ToString() == "")
               {
                   e.RepositoryItem = rbtnEdit;
               }
           }
       }

 

CustomRowCellEdit 이벤트에서 표시하고 싶은 셀에 조건을 두어 RepositoryItem에 버튼을 추가한다.

 

 

 

2. 실행 결과

 

반응형
반응형

 

C# 디렉토리 파일 구분 방법

 

사내 시스템에서 사용자가 파일 업로드 시

 

업로드 파일을 압축해서 보관하다가 압축파일 다운 후 압축을 해제하도록 했는데

 

사용자가 USB STICK을 사용하다 보니 압축 해제 속도가 나오지 않아서

 

그냥 폴더 상태로 보관하도록 루틴을 변경했다.

 

그러다보니 기존 ZIP파일일때와 폴더일때 구분이 필요하게 되었다.

 

 

            string path = "Selected Path";

            FileAttributes attr = File.GetAttributes(path);
            if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
            {
                //디렉토리(폴더)
            }
            else
            {
                //파일
            }
반응형
반응형

 

 

C# 숨김 폴더 체크 방법

이번 작업 중에 이동식 드라이브를 연결하면

 

모든 디렉토리와 파일을 삭제해야하는데

 

이동식 드라이브 내부에 두가지 숨겨진 폴더가 있어서

 

예외처리가 필요했다.

 

 

숨김폴더 체크 예제

using System.IO;

            string path = "D:\\";

            DirectoryInfo dir = new DirectoryInfo(path);

            if((dir.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)
            {
                Console.WriteLine("숨김 폴더");
            }

 

저는 디렉토리 &파일 삭제 재귀 함수에

 

Hidden 이면 예외처리하게 사용

 

 

 

반응형
반응형

최근 압축 및 압축해제를 구현해야해서 라이브러리를 찾아보던 중

IONIC.ZIP 라이브러리를 사용하게 되었습니다.

 

설치는 비주얼스튜디오 NuGet에서 Ionic으로 검색하면 설치할 수 있습니다.

 

예제는 선택한 폴더를 압축/압축해제 하는 예제 코드 입니다.

 

1. 압축

        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("*.*", System.IO.SearchOption.AllDirectories).Count();

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


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

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

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

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

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

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

                        // IBM437로 변환
                        fileName = Encoding.GetEncoding("IBM437").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($"{sTargetPath}\\{sZipName}.zip");
                }
                Process.Start(sTargetPath);
            }
            catch(Exception ex)
            {
                MessageBox.Show($"{ex.Message}\r\n압축 실패");
                return;
            }
        }

 

2. 압축 해제

 

       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 = $"{sTargetPath}\\{Path.GetFileNameWithoutExtension(sSourcePath)}";

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

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

                        zip[i].FileName = euckrFileName;

                        entry.Extract(saveFolderPath, ExtractExistingFileAction.OverwriteSilently);
                    }
                    Process.Start(saveFolderPath);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"{ex.Message}\r\n압축 해제 실패");
                return;
            }
        }

 

 

3. 예제 소스 코드 파일

 

 

 

 

 

 

 

 

 

 

 

 

WindowsFormsApp3.zip
0.86MB

프로그레스바를 ionic.zip에서 지원하는 이벤트로만 구현했는데

개인적으로 사용하실때에는 조금 손보는게 좋을 것 같습니다.

 

예제 코드는 이전에 구글링한 자료에 집에서 생각나는것만 정리한 정도이니 참고만 하시면 될 것 같습니다

 

 

 

반응형

+ Recent posts