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

后端 未结 27 1349
-上瘾入骨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:18

    This is an already answered question, but just for the sake of "Other options", here's a non-ideal one:

    (non-ideal because using Exceptions as flow control is a "Bad Thing", generally)

    public static bool IsLegalFilename(string name)
    {
        try 
        {
            var fileInfo = new FileInfo(name);
            return true;
        }
        catch
        {
            return false;
        }
    }
    
    0 讨论(0)
  • 2020-11-22 10:19

    Simplifying the Eugene Katz's answer:

    bool IsFileNameCorrect(string fileName){
        return !fileName.Any(f=>Path.GetInvalidFileNameChars().Contains(f))
    }
    

    Or

    bool IsFileNameCorrect(string fileName){
        return fileName.All(f=>!Path.GetInvalidFileNameChars().Contains(f))
    }
    
    0 讨论(0)
  • 2020-11-22 10:20

    Regular expressions are overkill for this situation. You can use the String.IndexOfAny() method in combination with Path.GetInvalidPathChars() and Path.GetInvalidFileNameChars().

    Also note that both Path.GetInvalidXXX() methods clone an internal array and return the clone. So if you're going to be doing this a lot (thousands and thousands of times) you can cache a copy of the invalid chars array for reuse.

    0 讨论(0)
  • 2020-11-22 10:20

    I suggest just use the Path.GetFullPath()

    string tagetFileFullNameToBeChecked;
    try
    {
      Path.GetFullPath(tagetFileFullNameToBeChecked)
    }
    catch(AugumentException ex)
    {
      // invalid chars found
    }
    
    0 讨论(0)
  • 2020-11-22 10:21

    Try to use it, and trap for the error. The allowed set may change across file systems, or across different versions of Windows. In other words, if you want know if Windows likes the name, hand it the name and let it tell you.

    0 讨论(0)
  • 2020-11-22 10:21

    The question is are you trying to determine if a path name is a legal windows path, or if it's legal on the system where the code is running.? I think the latter is more important, so personally, I'd probably decompose the full path and try to use _mkdir to create the directory the file belongs in, then try to create the file.

    This way you know not only if the path contains only valid windows characters, but if it actually represents a path that can be written by this process.

    0 讨论(0)
提交回复
热议问题