왜 나 는 Path.Combine 의 상세 한 설명 을 사용 하 는 것 을 좋아 하지 않 는 지 에 근거 하여
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));
}
}
}
결 과 는 다음 과 같다.
물론 너 도 할 수 있다.
Console.WriteLine("'{0}' + '{1}'= '{2}'", pa, pb, Path.Combine(pa, "def", pb));
결 과 는:
이 예 에서 알 수 있 듯 이 우 리 는 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));
}
}
}
너 는 이 코드 가 무엇 을 출력 하 는 지 아니?
이 코드 의 출력 은 다음 과 같 습 니 다.
"/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));
}
}
}
출력 결 과 는:
path 1 이'C:'라면 Path.Combine 결 과 는 부정 확 하 다 는 것 을 알 수 있다.
세 번 째:http 경 로 를 연결 할 수 없습니다.
로 컬 경로 연결 을 제외 하고 http 링크 주 소 를 연결 해 야 할 때 도 있 습 니 다.안 타 깝 게 도 System.IO.Path.Combine 은 http 주 소 를 연결 할 수 없습니다.
장 arrpa
string[] arr_pa = { @"http://www.Test.com/", @"http://www.Test.com" };
결 과 는 다음 과 같다.
여기 서 는 기술 이 별로 없다.순 전 히 외우 고 외 우 는 것 이다.
기억 하 다
정확 한 해 가 생 긴 다.
코드 를 변경 하면:
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));
}
}
}
그러면 어쨌든 당신 은 정확 한 결 과 를 얻 을 수 없습니다.
위 와 같은 몇 가지 부족 으로 인해 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));
}
}
}
결 과 는 다음 과 같다.
물론 너 도 그 럴 수 있다.
Console.WriteLine("{0}+{1}+{2}+{3}={4}",
pa, "p2", "\\p3/", pb, MyPath.Combine(pa, "p2", "\\p3/", pb));
출력 은 다음 과 같 습 니 다:
마지막 으로 Path.Combine 을 사용 하지 않 는 다 면 string.Format 도 선택 할 수 있 습 니 다.