2009-06-26 9 views
49

경로를 파일 이름과 결합하는 가장 좋은 방법은 무엇입니까?C#/.NET에서 경로와 파일 이름을 결합하는 가장 좋은 방법은 무엇입니까?

즉, c:\foobar.txt이 주어지면 c:\foo\bar.txt이 필요합니다.

을 감안할 때 c:\foo..\bar.txt, 나는 오류 또는 c:\foo\bar.txt 중 하나는 (내가 직접 Path.Combine()을 사용할 수 없습니다)합니다. 마찬가지로 c:\foobar/baz.txt의 경우 c:\foo\baz.txt (c:\foo\bar\baz.txt이 아님) 오류가 필요합니다.

나는 파일 이름에 '\'또는 '/'가 포함되어 있지 않은지 확인할 수 있지만 그 정도면 충분합니까? 그렇지 않은 경우 올바른 수표는 무엇입니까?

답변

83

당신은 "나쁜"파일 이름을 원하는 경우 (테스트하지를, 어쩌면 Path.GetFileName이 자동으로 처리합니다) 전직을 던지는없이 그냥에 자동으로 올바른 "나쁜"파일 이름을 원하는 경우,

if (Path.GetFileName(fileName) != fileName) 
{ 
    throw new Exception("'fileName' is invalid!"); 
} 
string combined = Path.Combine(dir, fileName); 

또는 : 오류가 발생 ception :

string combined = Path.Combine(dir, Path.GetFileName(fileName)); 
+9

프레임 워크에 익숙하지 않은 사용자는'Path'에 액세스하기 위해 파일에서'using System.IO; '호출이 필요합니다. –

+2

'Path.Combine'은 인수 중 하나가'null'이면'ArgumentNullException'을 던집니다. ** 빈 문자열을 두 인수 중 하나에 전달할 수 있습니다 ** –

+2

참고 : Path.Combine은 일반적으로 필요에 따라 각 경로 사이에 구분 기호를 추가합니다. 그러나 Path.Combine ("C :", "file.txt")은 올바른 경로가 아닌 "C : file.txt"를 반환합니다. – ConditionRacer

16

당신은 사용할 수 있습니다 :의 \ 밖으로 건너,

Path.Combine(folder, Path.GetFileName(fileName)) 

또는

Path.Combine(folder, Path.GetFileName(fileName.Replace("/","\\"))) 
+4

고마워요! 다만 FYI : 교체가 필요하지 않습니다. –

1

당신이 Path.Combine(arg1, arg2)를 사용할 때주의하십시오 - 사용자가 ARG2에 대한 완전한 파일 경로를 입력하면이 ARG1을 무시하고 경로로 ARG2 사용합니다.

제 의견으로는 Microsoft가 그걸 망쳤습니다! 이렇게하면 사용자가 전체 파일 시스템을 해킹 할 수 있습니다. 경고, 작은 글씨를 읽으십시오! 경로를 결합하는 경우 : var newPath = path1 + @"\" + path2; 예기치 않은 결과가 더 간단합니다 ...

+0

상대 경로 결합의 결과로 반환되는 오른쪽의 전체 경로가 올 바르고 유효한 결과입니다. –

+1

그것의 정확하고 유효한 결과에 상관없이, 너무 많은 devs는 코드 arg1이 폴더 경로이고 arg2가 사용자 입력 인 경우 arg2가 입력 된 절대 경로가 결과 출력이된다는 사실을 놓치고 있습니다. 내 의견으로는 웹 앱 해킹 ... 코드/셸 주입 중 최악의 상황을 열어보기가 너무 쉽습니다. 입력 내용을 확인하십시오. – Cyassin

+0

제 의견으로는 사용자가 아무런 점검없이 경로를 입력 할 수 있다고 생각하는 개발자는 해킹 당할 자격이 있습니다. 이것은 Day One 항목과 Path입니다 .Combine은 사용자가 생각하는대로 작동하도록 설계되지 않았습니다. 실제로 코드에서 내부 용도로 사용하기위한 터미널 백 슬래시를 확인하지 않아도되도록 적절하고 견고한 방법입니다. 파일을 보호하기위한 프런트 엔드가 아닙니다. 그것을위한 문서는 아주 완벽합니다 - 그냥 읽으십시오. – jinzai

관련 문제