2010-06-29 5 views
30

내가 지금처럼 Path.Combine를 사용하고 있습니다 : 내가 얻을.NET의 Path.Combine에서 슬래시를 백 슬래시로 변환하는 방법은 무엇입니까?

Path.Combine("test1/test2", "test3\\test4"); 

출력은 다음과 같습니다 슬래시는 백 슬래시로 변환되지 않습니다 방법

test1/test2\test3\test4 

공지 사항. 나는 string을 할 수 있다는 것을 안다. 바꾸기 위해 바꾸고 싶지만, 이것을하는 더 좋은 방법이 있는가?

+3

백 슬래시가 문제입니까? .NET 및 Windows 파일 API는이 중 하나를 허용합니다. –

+0

혼합 슬래시의 문제점은 무엇입니까? 화장대? – JBRWilkinson

+4

@ 존, 그렇습니다 : http://msdn.microsoft.com/en-us/library/system.io.path.combine.aspx. 아니면 C#과 .NET의 차이점에 대해 뻔뻔스러워 보려고 했습니까? –

답변

18

"test1/test2"는 이미 문자열 리터럴이므로 Path.Combine은 '/'를 '\'로 변경하지 않습니다.

Path.Combine만이 '\'가

test1/test2\test3\test4 

가장 좋은 방법이 당신의 출력에서, 것입니다,이 경우 윈도우에있는 OS가 사용하는 적절한 경로 구분 기호와 2 개의 문자열 리터럴 CONCAT 바꾸세요.

+22

감사합니다. 또는 Path.GetFullPath()가 슬래시를 백 슬래시로 대체한다는 사실을 알았습니다. –

+0

멋지다, 나는 그것을 몰랐다. 그러나 나는 확실히 그것을 메모 할 것이다. – Riaan

+3

결합 후에는 모든 유형의 슬래시를'Path.DirectorySeparatorChar'로 대체 할 수 있습니다. –

11

Uri 클래스를 사용해보세요. 올바른 대상 기계 (/ ->\)에 대해 유효한 Uris를 생성합니다. 첫째, 나는이 특별한 경우에 주장 할 것이다

+0

글쎄,이 작품입니다. '새로운 Uri (경로)'를 만들면 자동으로 백 슬래시로 변환됩니다. Nice – Edgar

+0

이것은 작동합니다 :'새로운 Uri (@ "c :/temp \ test /"). LocalPath' –

2

, 그것은 하나의 .Replace을 할 무리한되지 않을 것()

둘째, 당신은 또한 경로의 형식을 선택 System.Uri을 사용할 수 있습니다, 그것은 매우 엄격합니다. 그러나 이것은 단순한 .Replace()보다 더 많은 행이 될 것입니다. 나는 apperently 단지 당신이 그것을 사용하도록 투표하고 있습니다. 희망이 도움이

-3

아니요, 분리 문자는 읽기 전용으로 정의됩니다.

http://msdn.microsoft.com/en-us/library/system.io.path.pathseparator.aspx

당신은 사소한 변화의로 바꾸기 사용해야합니다.

+1

너 무슨 소리 야? 'DirectorySeparator'를 의미한다고 가정하더라도, 그는 시스템에서 사용하는 값이 아니라 문자열로 변경하려고합니다. – Gabe

1

, 당신이 Path.Combine가 결정하려면 string.replace와 열린 우리당 클래스의 방법으로 당신이 할 수에게 제공된 문자열

public static string Combine(string path1, string path2) 
{ 
    if ((path1 == null) || (path2 == null)) 
    { 
     throw new ArgumentNullException((path1 == null) ? "path1" : "path2"); 
    } 
    CheckInvalidPathChars(path1); 
    CheckInvalidPathChars(path2); 
    if (path2.Length == 0) 
    { 
     return path1; 
    } 
    if (path1.Length == 0) 
    { 
     return path2; 
    } 
    if (IsPathRooted(path2)) 
    { 
     return path2; 
    } 
    char ch = path1[path1.Length - 1]; 
    if (((ch != DirectorySeparatorChar) && (ch != AltDirectorySeparatorChar)) && (ch != VolumeSeparatorChar)) 
    { 
     return (path1 + DirectorySeparatorChar + path2); 
    } 
    return (path1 + path2); 
} 

에 동일한 슬래시를 변경하지 않습니다 볼 수 있습니다 닷넷 리플렉터를 사용하는 일 당신을 위해 가장 잘 작동합니다.

+0

'DirectorySeparatorChar = '\\''및'AltDirectorySeparatorChar = '/'' – Greg

65

다른 사람들처럼 Path.Combine은 구분 기호를 변경하지 않습니다. 그러나 당신은 전체 경로로 변환하는 경우 :

Path.GetFullPath(Path.Combine("test1/test2", "test3\\test4")) 

결과 정규화 된 경로 (Windows 용 백 슬래시) 표준 디렉토리 분리를 사용합니다.

+1

GetFullPath()가 상대 경로를 수정하고 전체 경로로 바꿀 때주의해야합니다. 상대 경로를 유지해야하는 경우 GetFullPath()가 작동하지 않습니다. –

+0

경로가 변경되지 않습니다 (모노) – George

+0

@ 조지, 확실하십니까 : 운영체제의 모노입니까? 사용중인 모노 버전 (Path.DirectorySeparatorChar)의 표준 경로 구분 기호는 무엇입니까? – Joe

관련 문제