임의의 문자열이 유효한 파일 이름인지 확인하는 가장 쉬운 방법


79

내 응용 프로그램에서 사용자는 파일 이름을 입력 할 수 있습니다. 처리하기 전에 입력 문자열이 Windows Vista에서 유효한 파일 이름인지 확인하고 싶습니다.

그렇게하는 가장 쉬운 방법은 무엇입니까?

유효 함으로 나는 합법적이며 존재하지 않는 것입니다.


유효한 파일 이름을 말할 때 파일이 존재한다는 사실을 말하는 것입니까, 아니면 운영 체제에서 이름을 허용할지 묻는 것입니까?
Jesse McCulloch 2011 년

4
(a) 기존, (b) 합법적 또는 (c) 합법적이거나 존재하지 않는 것과 같이 유효합니까?
Anthony Pegram 2011 년

Sry 내가 그것을 명확히 했어야했다. (c) leagl 및 존재하지 않아야합니다
RoflcoptrException 2011 년

4
@roflcopter : 파일을 생성하는 동안 오류를 처리해야합니다. 존재 확인을 포함하는 모든 파일 시스템 작업은 파일 시스템이 전역 공유 리소스이기 때문에 반환되는 시점에 이미 만료되었을 수 있습니다.
Ben Voigt 2011 년

1
@Roflcoptr : 유효성 및 / 또는 존재 여부를 확인하는 순간과 실제로 생성을 시도하는 순간 사이에 생성되는 똑같은 이름의 파일은 정상적인 프로그램 흐름으로 간주되지 않습니다. 당신은 해야 파일이 존재하지 않음을 확인하지만 실제로 파일을 생성 할 때, 그 지식은 이미 오래 만 추측 고려되어야한다. 여전히 사실 일 가능성이 높지만 보장 되지는 않습니다 .
Fredrik Mörk 2011 년

답변:


125

확인 여부 filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0!File.Exists(Path.Combine(someFolder, filename))


3
<quote>이 메서드에서 반환 된 배열은 파일 및 디렉터리 이름에 유효하지 않은 전체 문자 집합을 포함한다고 보장 할 수 없습니다. </ quote> 또한 해당 속성은 더 이상 사용되지 않습니다.
Ben Voigt 2011 년

4
카운터 - 예 : "http://www.microsoft.com/"테스트를 통과하지만에 대한 올바른 파일 이름, 저두하지 않습니다"::::"
벤 보이트

3
더 많은 반례 : ""은 유효하지 않으며 new String ( 'x', 1024)도 유효하지 않습니다.
Rasmus Faber 2011 년

2
@shellster Windows 탐색기에서 파일 이름을 ".txt"로 바꾸도록 지시하여 파일 이름을 ".txt"로 바꿀 수 있습니다. 팁 (또는 ".txt ........"도 작동 함).
Robert McKee

2
그것은해야한다 < 0대신 >= 0으로 IndexOfAny()돌아 -1 아무것도 발견되지 않을 경우
마이클 Tranchida을

37

다음에 대해 확인하십시오 GetInvalidFileNameChars().

var isValid = !string.IsNullOrEmpty(fileName) &&
              fileName.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 &&
              !File.Exists(Path.Combine(sourceFolder, fileName));

2
카운터 - 예 : "http://www.microsoft.com/"테스트를 통과하지만에 대한 올바른 파일 이름, 저두하지 않습니다"::::"
벤 보이트

1
@Ben Voigt : ::::타당하다고 잘못 간주 된 귀하의 말이 맞습니다 . < 0대신 표시하도록 답변을 수정했습니다 == 0.
Phil Hunt 2011 년

1
아, 방금 SLak이 GetInvalidFileNameChars아닌을 사용 하고 있는 것으로 나타났습니다 GetInvalidPathChars. 경로가있는 파일 이름이 아닌 파일 이름 만 테스트하는 한 괜찮습니다.
Ben Voigt 2011 년

@ 벤 보이트는 : 영업 검증이 파일이 아닌 존재 만 암시 적으로 파일 이름 및 경로의 유효성을 검사에 대해 질문 때문에, 내가 사용 GetInvalidFileNameChars:-)
필 헌트

11

파일을 만들려면 파일 대화 상자를 사용하여 디렉토리 경로를 지정해야합니다. 파일 이름에 대한 잘못된 문자 목록이 있습니다.

파일 이름이 허용되는지 확인하는 유일한 방법은 시도해 보는 것입니다. 권한은 모욕입니다.


파일 대화 상자는 붉은 청어이지만 "정말 신뢰할 수있는 방법은 ... 시도하는 것"에 대해 +1합니다.
Ben Voigt 2011 년

1
동의합니다. 파일 이름이 존재하지 않고 잘못된 문자가 포함되어 있지 않더라도 파일이 생성되지 않는 데는 여러 가지 이유가 있습니다. 가장 분명한 이유는 디렉토리에 대한 생성 권한이 없다는 것입니다.
Bob Kaufman 2011 년

알 수없는 경로에 저장해야하지만 사용자가 정확한 경로를 선택하는 것을 원하지 않는 경우가 있습니다. 이 경우 파일 대화 상자가 실행되지 않습니다.
Josh Noe

2

나는 이것을 사용한다 :

public static bool IsValidFileName(string name) {
    if(string.IsNullOrWhiteSpace(name)) return false;
    if(name.Length > 1 && name[1] == ':') {
        if(name.Length < 4 || name.ToLower()[0] < 'a' || name.ToLower()[0] > 'z' || name[2] != '\\') return false;
        name = name.Substring(3);
    }
    if(name.StartsWith("\\\\")) name = name.Substring(1);
    if(name.EndsWith("\\") || !name.Trim().Equals(name) || name.Contains("\\\\") ||
        name.IndexOfAny(Path.GetInvalidFileNameChars().Where(x=>x!='\\').ToArray()) >= 0) return false;
    return true;
}

예약 된 이름, 권한 및 길이 제한을 제외한 모든 것을 처리해야합니다. 이것은 상대 및 절대 파일 이름을 모두 허용합니다.


0

이것은 단지 아이디어입니다. 예외 목록을 채워야합니다.

public static bool IsValidFilename(string filename)
{
    try
    {
        File.OpenRead(filename).Close();
    }
    catch (ArgumentException) { return false; }
    catch (Exception) { }
    return true;
}

파일이 아직 존재하지 않으면 어떻게합니까?
Mike Cheel 19

@MikeCheel이 코드는 인수 예외가 발생하는 경우에만 false를 반환합니다. 그 예외는 파일 이름이 유효하지 않은 경우에만 발생합니다.
Burak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.