티스토리 뷰
목차
구체적인 예를 들어 말씀드리면 이렇습니다. C# URI 사용할 때, 파일 이름에 # 이 들어가 있으면 오류가 발생합니다. 프로그램 오류가 아니라, 개발자가 원하는 결과가 나오질 않아요.
왜냐면 C# URI, GetRequest() 에서 특수문자 #은 anchor 예약어 입니다. 그래서 파일 이름에 #을 제거하는 것이 가장 좋은데, 그게 어렵다면, Url Encode 해줘야 합니다.
우선 C# System.Net.FtpWebRequest 및 GetRequest 활용한 예제 살펴볼게요. 20번 라인 URI에서 의도치 않은 결과가 발생합니다. 파일 이름에 #이 들어감으로 인하여 1#.txt, 123#.txt 등 # 뒤의 문자를 인식하지 못합니다.
그래서, 엉뚱한 이름의 파일 이름이 생성되거나, 파일 자체를 만들지 못하는 문제가 생깁니다. Anchor에 영향을 주는 겁니다.
▷ FTP 업로드 예제 소스 (정상)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | public bool Upload(FileInfo fi, string targetFilename) { string target; if (targetFilename.Trim() == "") { target = this.CurrentDirectory + fi.Name; } else if (targetFilename.Contains("/")) { target = AdjustDir(targetFilename); } else { target = CurrentDirectory + targetFilename; } string URI = Hostname + target; System.Net.FtpWebRequest ftp = GetRequest(URI); ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile; ftp.UseBinary = true; ftp.UsePassive = true; ftp.ContentLength = fi.Length; const int BufferSize = 2048; byte[] content = new byte[BufferSize - 1 + 1]; int dataRead; using (FileStream fs = fi.OpenRead()) { try { using (Stream rs = ftp.GetRequestStream()) { do { dataRead = fs.Read(content, 0, BufferSize); rs.Write(content, 0, dataRead); } while (!(dataRead < BufferSize));<br /> rs.Close(); } } catch (Exception) { } finally { fs.Close(); } } ftp = null; return true; } | cs |
위 소스는 정상이지만, 파일 이름에 anchor 예약어 #이 들어가면 의도치 않은 결과가 발생합니다. 이때 해결 방법은 2가지입니다.
- 파일 이름에서 # 문자를 제거한다
- Url Encode로 얻은 값을 전달한다
1번은 생략하고, 2번 해결 방법 알려드릴게요.
Url Encode : 사이트 바로가기
위 사이트로 이동해 특수문자 # 이 어떻게 변하는지 살펴보세요.
[C# URI Anchor 예약어 # 및 Url Encode 사이트]
빨간색 박스 안에 있는 문자처럼 # 특수문자가 %23으로 바뀐 것이 확인되네요.
이런식으로 C# URI Anchor 에서 사용하는 특수문자 처리할 수 있습니다. 뭐, 기본적으로 파일 이름에 특수 문자 안 쓰는 게 제일 좋지만, 이런 식으로도 해결할 수 있습니다.
관련 글
▷ [코딩지식] 특수문자, 특수기호 영어로 읽기 (영문 이름)
▷ C# HttpWebRequest, HttpWebResponse 삭제된 블로그 URL 찾기
▷ C# URL 웹페이지 존재 확인 (WebBrowser.Url - HTML)
ⓒ written by vicddory