왜 나 는 Path.Combine 의 상세 한 설명 을 사용 하 는 것 을 좋아 하지 않 는 지 에 근거 하여

8893 단어 Path.Combine
Path.Combine:
image
Path.Combine 은 언제 사용 할 까요?물론 경로 문자열 을 연결 할 때!
그래서 아래 코드 는 완벽 하 게 작업 할 수 있 습 니 다.
public static void Main()
{
    string[] arr_pa = { @"c:\abc\", @"c:\abc" };
    string[] arr_pb = { @"test.txt" };
    foreach (string pa in arr_pa)
    {
        foreach (string pb in arr_pb)
        {
            Console.WriteLine("'{0}' + '{1}'= '{2}'", pa, pb, Path.Combine(pa, pb));
        }
    }
}
결 과 는 다음 과 같다.
image
물론 너 도 할 수 있다.
Console.WriteLine("'{0}' + '{1}'= '{2}'", pa, pb, Path.Combine(pa, "def", pb));
결 과 는:
image
이 예 에서 알 수 있 듯 이 우 리 는 arr 를 고려 할 필요 가 없다.pa 안의 문자열 이'\'로 끝 나 는 지 여 부 는 확실히 편 의 를 제공 합 니 다.그리고 이것 도 많은 사람들 이 Path.Combine 을 사용 하 는 것 을 좋아 하 는 이유 입 니 다.하지만 그것 뿐 입 니 다.
Path.Combine 은 경로 연결 문 제 를 해결 하 였 으 나 많은 사람들 이 일방적으로 그것 을 이해 하기 때문에 모든 것 이 잘못된 응용 을 초래 하기 쉽다.Path.Combine 을 잘 사용 하 는 것 은 쉽 지 않다.다음은 몇 가지 실례 를 들 어 이 점 을 설명 하 겠 다.
첫 번 째:path 2 가 상대 경로 일 때 path 2 를 되 돌려 주 고 path 1 은 버 려 집 니 다.
아래 코드 를 보 세 요.
public static void Main()
{
    string[] arr_pa = { @"c:\abc\", @"c:\abc" };
    string[] arr_pb = { @"\test.txt", @"/test.txt", @"test.txt" };
    foreach (string pa in arr_pa)
    {
        foreach (string pb in arr_pb)
        {
            Console.WriteLine("'{0}' + '{1}'= '{2}'", pa, pb, Path.Combine(pa, pb));
        }
    }
}
너 는 이 코드 가 무엇 을 출력 하 는 지 아니?
이 코드 의 출력 은 다음 과 같 습 니 다.
image
"/test.txt"와"\test.txt"를 볼 수 있 습 니 다.Path.Combine 은 path 2 가 상대 적 인 경로 라 고 생각 하기 때문에 path 2 로 직접 돌아 갑 니 다.
두 번 째:경 로 는 드라이브 입 니 다.돌아 오 는 결과 가 정확 하지 않 습 니 다.
public static void Main()
{
    string[] arr_pa = { @"c:", @"c:\" };
    string[] arr_pb = { @"\test.txt", @"/test.txt", @"test.txt" };
    foreach (string pa in arr_pa)
    {
        foreach (string pb in arr_pb)
        {
            Console.WriteLine("'{0}' + '{1}'= '{2}'", pa, pb, Path.Combine(pa, pb));
        }
    }
}
출력 결 과 는:
image
path 1 이'C:'라면 Path.Combine 결 과 는 부정 확 하 다 는 것 을 알 수 있다.
세 번 째:http 경 로 를 연결 할 수 없습니다.
로 컬 경로 연결 을 제외 하고 http 링크 주 소 를 연결 해 야 할 때 도 있 습 니 다.안 타 깝 게 도 System.IO.Path.Combine 은 http 주 소 를 연결 할 수 없습니다.
장 arrpa
string[] arr_pa = { @"http://www.Test.com/", @"http://www.Test.com" };
결 과 는 다음 과 같다.
image
여기 서 는 기술 이 별로 없다.순 전 히 외우 고 외 우 는 것 이다.
기억 하 다
image
정확 한 해 가 생 긴 다.
코드 를 변경 하면:
public static void Main()
{
    string[] arr_pa = { @"http://www.Test.com/", @"http://www.Test.com" };
    string[] arr_pb = { @"\test.txt", @"/test.txt", @"test.txt" };
    foreach (string pa in arr_pa)
    {
        foreach (string pb in arr_pb)
        {
            Console.WriteLine("'{0}' + '{1}'= '{2}'", pa, pb, Path.Combine(pa, "def", pb));
        }
    }
}
그러면 어쨌든 당신 은 정확 한 결 과 를 얻 을 수 없습니다.
image
위 와 같은 몇 가지 부족 으로 인해 Path.Combine 이 사용 하기 어 려 운 것 도 일부 사람들 이 String.Format 을 사용 하 는 이유 입 니 다.
물론,나 는 위의 문 제 를 해결 할 수 있 는 MyPath.Combine 방법 을 썼 다

class MyPath
    {
        public static string Combine(params string[] paths)
        {
            if (paths.Length == 0)
            {
                throw new ArgumentException("please input path");
            }
            else
            {
                StringBuilder builder = new StringBuilder();
                string spliter = "\\";

                string firstPath = paths[0];

                if (firstPath.StartsWith("HTTP", StringComparison.OrdinalIgnoreCase))
                {
                    spliter = "/";
                }

                if (!firstPath.EndsWith(spliter))
                {
                    firstPath = firstPath + spliter;
                }
                builder.Append(firstPath);

                for (int i = 1; i < paths.Length; i++)
                {
                    string nextPath = paths[i];
                    if (nextPath.StartsWith("/") || nextPath.StartsWith("\\"))
                    {
                        nextPath = nextPath.Substring(1);
                    }

                    if (i != paths.Length - 1)//not the last one
                    {
                        if (nextPath.EndsWith("/") || nextPath.EndsWith("\\"))
                        {
                            nextPath = nextPath.Substring(0, nextPath.Length - 1) + spliter;
                        }
                        else
                        {
                            nextPath = nextPath + spliter;
                        }
                    }

                    builder.Append(nextPath);
                }

                return builder.ToString();
            }
        }
    }

사용 도 간단 합 니 다.
예 를 들 면:
public static void Main()
{
    string[] arr_pa = { @"c:\abc\", @"c:\abc", @"http://www.Test.com/", @"http://www.Test.com" };
    string[] arr_pb = { @"\test.txt", @"/test.txt", @"test.txt" };
    foreach (string pa in arr_pa)
    {
        foreach (string pb in arr_pb)
        {
            Console.WriteLine("'{0}' + '{1}'= '{2}'", pa, pb, MyPath.Combine(pa, pb));
        }
    }
}
결 과 는 다음 과 같다.
image
물론 너 도 그 럴 수 있다.
Console.WriteLine("{0}+{1}+{2}+{3}={4}",
                        pa, "p2", "\\p3/", pb, MyPath.Combine(pa, "p2", "\\p3/", pb));
출력 은 다음 과 같 습 니 다:
image
마지막 으로 Path.Combine 을 사용 하지 않 는 다 면 string.Format 도 선택 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기