How do I check if a given string is a legal/valid file name under Windows?

后端 未结 27 1921
-上瘾入骨i
-上瘾入骨i 2020-11-22 09:38

I want to include a batch file rename functionality in my application. A user can type a destination filename pattern and (after replacing some wildcards in the pattern) I n

27条回答
  •  南方客
    南方客 (楼主)
    2020-11-22 10:21

    many of these answers will not work if the filename is too long & running on a pre Windows 10 environment. Similarly, have a think about what you want to do with periods - allowing leading or trailing is technically valid, but can create problems if you do not want the file to be difficult to see or delete respectively.

    This is a validation attribute I created to check for a valid filename.

    public class ValidFileNameAttribute : ValidationAttribute
    {
        public ValidFileNameAttribute()
        {
            RequireExtension = true;
            ErrorMessage = "{0} is an Invalid Filename";
            MaxLength = 255; //superseeded in modern windows environments
        }
        public override bool IsValid(object value)
        {
            //http://stackoverflow.com/questions/422090/in-c-sharp-check-that-filename-is-possibly-valid-not-that-it-exists
            var fileName = (string)value;
            if (string.IsNullOrEmpty(fileName)) { return true;  }
            if (fileName.IndexOfAny(Path.GetInvalidFileNameChars()) > -1 ||
                (!AllowHidden && fileName[0] == '.') ||
                fileName[fileName.Length - 1]== '.' ||
                fileName.Length > MaxLength)
            {
                return false;
            }
            string extension = Path.GetExtension(fileName);
            return (!RequireExtension || extension != string.Empty)
                && (ExtensionList==null || ExtensionList.Contains(extension));
        }
        private const string _sepChar = ",";
        private IEnumerable ExtensionList { get; set; }
        public bool AllowHidden { get; set; }
        public bool RequireExtension { get; set; }
        public int MaxLength { get; set; }
        public string AllowedExtensions {
            get { return string.Join(_sepChar, ExtensionList); } 
            set {
                if (string.IsNullOrEmpty(value))
                { ExtensionList = null; }
                else {
                    ExtensionList = value.Split(new char[] { _sepChar[0] })
                        .Select(s => s[0] == '.' ? s : ('.' + s))
                        .ToList();
                }
        } }
    
        public override bool RequiresValidationContext => false;
    }
    

    and the tests

    [TestMethod]
    public void TestFilenameAttribute()
    {
        var rxa = new ValidFileNameAttribute();
        Assert.IsFalse(rxa.IsValid("pptx."));
        Assert.IsFalse(rxa.IsValid("pp.tx."));
        Assert.IsFalse(rxa.IsValid("."));
        Assert.IsFalse(rxa.IsValid(".pp.tx"));
        Assert.IsFalse(rxa.IsValid(".pptx"));
        Assert.IsFalse(rxa.IsValid("pptx"));
        Assert.IsFalse(rxa.IsValid("a/abc.pptx"));
        Assert.IsFalse(rxa.IsValid("a\\abc.pptx"));
        Assert.IsFalse(rxa.IsValid("c:abc.pptx"));
        Assert.IsFalse(rxa.IsValid("c

提交回复
热议问题