web-dev-qa-db-ja.com

任意の文字列が有効なファイル名であるかどうかを確認する最も簡単な方法

私のアプリケーションでは、ユーザーはファイル名を入力できます。処理する前に、入力文字列がWindows Vistaで有効なファイル名かどうかを確認します。

それを行う最も簡単な方法は何ですか?

有効な場合、私は法的で存在しないものに言及しています

66

filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0および!File.Exists(Path.Combine(someFolder, filename))かどうかを確認します

113
SLaks

GetInvalidFileNameChars()に対してチェック:

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

ファイルを作成する場合は、ファイルダイアログを使用してディレクトリパスを指定する必要があります。ファイル名に無効な文字の短いリストがあります。

ファイル名が受け入れられるかどうかを判断する唯一の本当に信頼できる方法は、それを試すことです。権限は泥沼です。

12
ddyer

私はこれを使用します:

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;
}

予約名、許可、および長さの制限を除くすべてに注意する必要があります。これは、相対ファイル名と絶対ファイル名の両方を受け入れます。

1
Duke Nukem

これは単なるアイデアです。例外リストに入力する必要があります。

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