[C#] 경로와 파일 이름에서 잘못된 문자를 제거하는 방법은 무엇입니까?
간단한 문자열에서 잘못된 경로와 파일 문자를 제거하는 강력하고 간단한 방법이 필요합니다. 아래 코드를 사용했지만 아무것도하지 않는 것 같습니다. 무엇이 누락 되었습니까?
using System;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string illegal = "\"M<>\"\\a/ry/ h**ad:>> a\\/:*?\"<>| li*tt|le|| la\"mb.?";
illegal = illegal.Trim(Path.GetInvalidFileNameChars());
illegal = illegal.Trim(Path.GetInvalidPathChars());
Console.WriteLine(illegal);
Console.ReadLine();
}
}
}
답변
대신 이와 같은 것을 시도하십시오.
string illegal = "\"M\"\\a/ry/ h**ad:>> a\\/:*?\"| li*tt|le|| la\"mb.?";
string invalid = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
foreach (char c in invalid)
{
illegal = illegal.Replace(c.ToString(), "");
}
그러나 나는 의견에 동의해야합니다. 나는 불법 경로를 합법적이지만 의도하지 않은 경로로 엉망으로 만들기보다는 불법 경로의 출처를 다루려고 노력할 것입니다.
편집 : 또는 Regex를 사용하여 잠재적으로 ‘더 나은’솔루션.
string illegal = "\"M\"\\a/ry/ h**ad:>> a\\/:*?\"| li*tt|le|| la\"mb.?";
string regexSearch = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch)));
illegal = r.Replace(illegal, "");
아직도, 질문은 구걸, 왜 당신이 처음에 이것을하고 있는지.
답변
원래 질문은 “잘못된 문자 제거”를 요청했습니다.
public string RemoveInvalidChars(string filename)
{
return string.Concat(filename.Split(Path.GetInvalidFileNameChars()));
}
대신 그것들을 바꾸고 싶을 수도 있습니다.
public string ReplaceInvalidChars(string filename)
{
return string.Join("_", filename.Split(Path.GetInvalidFileNameChars()));
}
이 답변은 Ceres의 또 다른 스레드에 있었으며 정말 깔끔하고 간단합니다.
답변
Linq를 사용하여 파일 이름을 정리합니다. 유효한 경로를 확인하기 위해이를 쉽게 확장 할 수 있습니다.
private static string CleanFileName(string fileName)
{
return Path.GetInvalidFileNameChars().Aggregate(fileName, (current, c) => current.Replace(c.ToString(), string.Empty));
}
최신 정보
일부 의견은이 방법이 작동하지 않는다고 표시하므로 DotNetFiddle 코드 조각에 대한 링크를 포함하여 방법을 확인할 수 있습니다.
답변
Linq를 사용하여 다음과 같이 잘못된 문자를 제거 할 수 있습니다.
var invalidChars = Path.GetInvalidFileNameChars();
var invalidCharsRemoved = stringWithInvalidChars
.Where(x => !invalidChars.Contains(x))
.ToArray();
편집
주석에 언급 된 필수 편집으로 표시되는 방식입니다.
var invalidChars = Path.GetInvalidFileNameChars();
string invalidCharsRemoved = new string(stringWithInvalidChars
.Where(x => !invalidChars.Contains(x))
.ToArray());
답변
이것들은 모두 훌륭한 솔루션이지만, 모두 Path.GetInvalidFileNameChars
신뢰할 수있는 것입니다. MSDN 설명서에서 Path.GetInvalidFileNameChars
다음 내용 을 확인하십시오 .
이 메소드에서 리턴 된 배열 은 파일 및 디렉토리 이름에 유효하지 않은 전체 문자 세트를 포함하지 않을 수 있습니다. 유효하지 않은 문자의 전체 세트는 파일 시스템에 따라 다를 수 있습니다. 예를 들어, Windows 기반 데스크탑 플랫폼에서 유효하지 않은 경로 문자는 ASCII / 유니 코드 문자 1-31뿐만 아니라 따옴표 ( “), (<)보다 작음 (<),보다 큼 (>), 파이프 (|), 백 스페이스 ( \ b), null (\ 0) 및 탭 (\ t)입니다.
Path.GetInvalidPathChars
방법으로는 나아지지 않습니다 . 똑같은 말이 들어 있습니다.
답변
파일 이름의 경우 :
var cleanFileName = string.Join("", fileName.Split(Path.GetInvalidFileNameChars()));
전체 경로 :
var cleanPath = string.Join("", path.Split(Path.GetInvalidPathChars()));
이 기능을 보안 기능으로 사용하려는 경우보다 강력한 방법은 모든 경로를 확장 한 다음 사용자 제공 경로가 사용자가 액세스 할 수있는 디렉토리의 하위 항목인지 확인하는 것입니다.
답변
우선 Trim은 문자열의 시작 또는 끝에서 문자 만 제거합니다 . 두 번째로, 공격적인 문자를 실제로 제거 할 것인지 평가하거나 빠르게 실패하여 파일 이름이 잘못되었음을 사용자에게 알려야합니다. 내 선택은 후자이지만, 내 대답은 적어도 옳고 그른 방법으로 일을하는 방법을 보여 주어야합니다.
주어진 문자열이 유효한 파일 이름인지 확인하는 방법을 보여주는 StackOverflow 질문 . 이 질문에서 정규 표현식을 사용하여 정규 표현식 대체 문자를 제거 할 수 있습니다 (실제로이 작업을 수행 해야하는 경우).