When I try to save a file, if I use special characters in the name (such as a colon, question mark, or exclamation point) in Windows I get a message saying that the file name is invalid.

Why is that?


There are several characters that have special meaning to Windows (and to DOS, where most of the characters originally came from)

from MSDN:

A filename cannot contain any of the following characters:
\ / : * ? " < > |

/ is a switch (and also a directory separator).
\ is a directory separator.
: is a drive designator.
* and ? are wildcards used in searching.
" is a way to allow spaces in parameters.
< and > are redirection that allow input and output of a program to come from, and go to, something other than screen/keyboard.
| is a pipe that allows output from one program to be used as input to the next.

| improve this answer | |
  • 1
    To clarify this answer, these special characters could interfere with parsing a command line (or path) if they were in a filename. There is no requirement to delimit the filename in any way (e.g. surround it with quotes or spaces), so encountering such a special char would cause incorrect parsing (i.e is the special char part of the filename or an operator?). – sawdust Dec 27 '13 at 20:41
  • 1
    It is, however, arguable that some of these restrictions are no longer necessary due to the handling of long filenames and quotations marks. \ ? * and " are the only ones really necessary in the current syntax, as the other characters are only useful outside of quotation marks. The exception is : which is only useful as the second character, which could be outlawed while allowing it elsewhere. In other words, no file named A:A letter's story.txt, but no problem with a file named Sarah: My favorite cat.txt – trlkly Jun 5 '14 at 23:41
  • <>" are reserved wildcard characters. Windows uses them to implement the complex semantics for DOS *?. when translating to native NT, which has simple semantics for *?.. The six wildcard characters are reserved because Windows implements wildcard matching in the file system itself, i.e. directly in the NtQueryDirectoryFile system call, with no escaping mechanism. In Unix, wildcards are implemented at the application level, usually by a shell that supports escaping them. – Eryk Sun Sep 3 '19 at 13:41
  • Note that : is usually reserved in filenames, but not in file paths. It's used for device names and as the delimiter for file streams (e.g. "filename:streamname:streamtype"). Also, some file systems such as the VirtualBox shared-folder file system allow :, |, and ASCII control characters (1-31) in filenames, but they're reserved in all of Microsoft's file systems except for the named-pipe file system. – Eryk Sun Sep 3 '19 at 13:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.