C# 알아가기 (5-1. C# FTP 관리 프로그램 수정)

min seung moon·2021년 8월 13일
0

C#알아가기

목록 보기
7/10
post-custom-banner

1. 수정

01. FTP 접속 정보 저장

  • 체크를 했는데도 저장이 안되었는걸 확인못했네요!
    • Properties.Settings.Default.Save(); 문을 까먹었네요ㅎㅎ
            if(saveFtpInfo.Checked)
            {
                Properties.Settings.Default.FtpIpAddress = FTPIpAddrTxt.Text;
                Properties.Settings.Default.FtpPort = FTPPortTxt.Text;
                Properties.Settings.Default.FtpUserId = FTPUserIdTxt.Text;
                Properties.Settings.Default.FtpUserPw = FTPUserPwTxt.Text;
                Properties.Settings.Default.FtpSaveInfo = true;
            }
            else
            {
                Properties.Settings.Default.FtpSaveInfo = false;
            }
            Properties.Settings.Default.Save();


02. 폴더 삭제 및 빈 폴더 출력

  • 첫 번째 코드와 사진은 파일이 없는 폴더일 경우 EMPTY Item을 추가해주는 코드입니다
    • 이 EMPTY 기준으로 폴더 경로만 받아서 삭제할 예정입니다.
    • 굳이 안해도 되지 않을까 했는데 Group은 선택이나 클릭이벤트가 없어서 Item에게 줘야 하는데 Item을 공백으로 하면 이게 있는지 어디를 눌러야하는지 보기 힘들어서 EMPTY라는 문자를 넣었습니다.
  • 두번째 코드와 사진은 Item을 선택했을 때 삭제 또는 업로드 텍스트 박스에 입력이 되는데 EMPTY가 텍스트박스에 입력되면 이벤트를 실행시 Exception이 일어나기에 검열하고 텍스트 박스에 입력하게 해두었습니다
  • 마지막은 파일 삭제 뿐만이 아니라 EMPTY 아이템을 눌러서 폴더 삭제도 가능하도록 수정했습니다
    • path 변수를 /를 기준으로 Split해서 2이상이면 파일이라고 인식하게 했어요!
    • 하지만 2중 폴더면 안되겠네요...
    • 잘못했네 ㅎㅎㅎ 좀 더 생각해보고 수정을 할게요! 일단 1차 오류 수정
        // 전체파일 불러오기
        private List<DirectoryPath> getFTPList(string path)
        {
            string url = $@"FTP://{this.ipAddr}:{this.port}/{path}";
            DirectoryPath directoryPath = null;
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);
            request.Credentials = new NetworkCredential(userId, pwd);
            request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

            using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
            {
                using(StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8))
                {
                    string strData = reader.ReadToEnd();
                    if(string.IsNullOrEmpty(strData))
                    {
                        directoryPath = new DirectoryPath();
                        directoryPath.Folder = path;
                        directoryPath.File = "EMPTY";
                        directoryPaths.Add(directoryPath);
                    }

                    string[] filename = strData.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

                    foreach (string file in filename)
                    {
                        string[] fileDetailes = file.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);

                        directoryPath  = new DirectoryPath();

                        if (fileDetailes[0].Contains("d"))
                        {
                            getFTPList($"{path}{fileDetailes[8]}/");
                        }
                        else
                        {
                            directoryPath.Folder = path;
                            directoryPath.File = fileDetailes[8];
                            directoryPaths.Add(directoryPath);
                        }
                        //Console.WriteLine($"권한 : {fileDetailes[0]}");
                        //Console.WriteLine($"파일or폴더 : {fileDetailes[8]}");
                    }

                    return directoryPaths;
                }
            }
        }

        // menu item선택 이벤트
        private void NavBarItem_CLick(object sender, NavBarLinkEventArgs e)
        {
            NavBarItem item = (NavBarItem)sender;
            string Folder = $"/{item.Hint.Replace("/", "")}";
            string File = (string.IsNullOrEmpty(item.Caption) || item.Caption.Equals("EMPTY")) ? "" : $"/{item.Caption}";
            saveDirPath.Text = Folder;
            saveFilePath.Text = File;

            deleteFilePath.Text = $"{Folder}{File}";
        }

        // FTP 파일 삭제
        public bool DeleteFTPFile(string path)
        {
            try
            {
                string url = $@"FTP://{this.ipAddr}:{this.port}/{path}";

                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(url);

                request.Credentials = new NetworkCredential(userId, pwd);
                if (path.Split('/').Count() > 2)
                    request.Method = WebRequestMethods.Ftp.DeleteFile;
                else
                    request.Method = WebRequestMethods.Ftp.RemoveDirectory ;

                using (request.GetResponse()) { }
            }
            catch
            {
                return false;
            }
            return true;
        }

03. 업로드 경로

  • FTP 업로드 경로를 정해진 방식으로 입력 안하면 Exception이 발생해서 Upload 버튼을 눌렀을 때 비었거나 아니면 정규표현식을 pass 하지 못하면 메시지박스를 뜨도록 설정했습니다!
    • 정규표현식은 /로 시작해서 영문대소문자숫자한글입력 및 마지막에 영문대소문자숫자한글만 오도록 했습니다
        // 업로드 버튼
        private void UploadBtn_Click(object sender, EventArgs e)
        {
            if(!result)
            {
                MessageBox.Show("FTP 연결을 먼저 진행해주세요.");
                return;
            }
            if(openFileTxt.Text.Equals("Click choise File") || string.IsNullOrEmpty(openFileTxt.Text))
            {
                MessageBox.Show("업로드할 파일을 선택해주세요.");
                return;
            }
            if (string.IsNullOrEmpty(uploadFolderTxt.Text) || !Regex.IsMatch(uploadFolderTxt.Text, @"(\/|\\){1}[a-zA-Z0-9ㄱ-ㅎ가-힣]+$")) 
            {
                MessageBox.Show("업로드할 위치를 입력해주세요.\n(/폴더, /폴더/폴더 형식으로 입력해주세요.)");
                return;
            }
            string fileName = openFileTxt.Text;
            string path = uploadFolderTxt.Text.Replace('\\','/'); // 업로드할 파일 저장할 FTP 경로 지정

            if (fTP.UpLoad(path, fileName) == false) // 파일 업로드
            {
                MessageBox.Show("FTP Upload 실패");
            }
            else
            {
                MessageBox.Show("FTP Upload시작");
                MessageBox.Show("FTP Upload완료");
                ResetMenuBar();
            }
            /*
            // 기준 경로의 모든 파일을 업로드 할 때 사용
            string localPath = @"C:\Users\jjh\Desktop\"; // 바탕화면 경로를 기준으로 둔다
            DirectoryInfo dirinfo = new DirectoryInfo(localPath);
            FileInfo[] infos = dirinfo.GetFiles();
            foreach (FileInfo info in infos)
            {
                if (Path.GetExtension(info.FullName) == ".txt") // txt 확장자 파일만 FTP 서버에 Upload
                {
                    if (fTP.UpLoad(path, info.FullName) == false) // 파일 업로드
                    {
                        MessageBox.Show("FTP Upload 실패");
                    }
                    else
                    {
                        MessageBox.Show("FTP Upload시작");
                        MessageBox.Show("FTP Upload완료");
                    }

                }
            }
            */
        }


04. 후기

  • 음 폴더 리스트를 어떻게 뿌려줄지도 생각해봐야 겠고 삭제도 좀 더 고려해봐야 겠네요
  • 시간나면 조금씩 해보겠습니다
  • 쉽지 않네요
profile
아직까지는 코린이!
post-custom-banner

0개의 댓글