티스토리 뷰

목차

    반응형

    구체적인 예를 들어 말씀드리면 이렇습니다. 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가지입니다.


    1. 파일 이름에서 # 문자를 제거한다
    2. Url Encode로 얻은 값을 전달한다


    1번은 생략하고, 2번 해결 방법 알려드릴게요.



    위 사이트로 이동해 특수문자 # 이 어떻게 변하는지 살펴보세요.


    C# URI Anchor 예약어 # 및 Url Encode 사이트[C# URI Anchor 예약어 # 및 Url Encode 사이트]


    빨간색 박스 안에 있는 문자처럼 # 특수문자가 %23으로 바뀐 것이 확인되네요.


    이런식으로 C# URI Anchor 에서 사용하는 특수문자 처리할 수 있습니다. 뭐, 기본적으로 파일 이름에 특수 문자 안 쓰는 게 제일 좋지만, 이런 식으로도 해결할 수 있습니다.



    관련 글


    [코딩지식] 특수문자, 특수기호 영어로 읽기 (영문 이름)

    C# HttpWebRequest, HttpWebResponse 삭제된 블로그 URL 찾기

    C# URL 웹페이지 존재 확인 (WebBrowser.Url - HTML)



    ⓒ written by vicddory

    반응형