Stefan Feenstra created IO-860:
----------------------------------

             Summary: Missing reserved filenames for Windows in FileSystem.java 
(superscript digits for COM and LPT) 
                 Key: IO-860
                 URL: https://issues.apache.org/jira/browse/IO-860
             Project: Commons IO
          Issue Type: Bug
          Components: Utilities
    Affects Versions: 2.17.0
            Reporter: Stefan Feenstra


Per Microsoft documentation, the following filenames are also reserved 
filenames: LPT¹, LPT², LPT³, COM¹, COM² and COM³.
As far as I can tell, only the non-superscript filenames are marked as illegal 
in the FileSystem.WINDOWS enum. These six filenames should also be added as 
reserved filenames, as they can not be used for regular files. (e.g. trying to 
create a file called COM³ will fail).

 

Quote from the [microsoft 
documentation|[https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#win32-file-namespaces|https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#file-and-directory-names]]:
{code:java}
Windows recognizes the 8-bit ISO/IEC 8859-1
 superscript digits ¹, ², and ³ as digits and treats them as valid parts
 of COM# and LPT# device names, making them reserved in every directory. {code}
Testing code to reproduce: (there should be no output)
{code:java}
import org.apache.commons.io.FileSystem;

public class FilenameTest {

    public static void main(String[] args) {
        char[] digitsWithSuperScript = {'1', '2', '3', '4', '5', '6', '7', '8', 
'9', '¹', '²', '³'};

        for (String filenamesPrefix : new String[]{"LPT", "COM"}) {
            for (char digit : digitsWithSuperScript) {
                final String filename = filenamesPrefix + digit;
                checkFilename(filename, true);
                // Base filename should be reserved
                checkFilename(filename + ".tar.gz", true);
                // Extensions should be ignored
                checkFilename(filename + ".txt", true);
                // Non-extension suffixes are ok.
                checkFilename(filename + "additional_text", false);
            }
        }

        for (String reservedFileName : new String[]{"CON", "PRN", "AUX", "NUL", 
"CONIN$", "CONOUT$"}) {
            // Base filename should be reserved
            checkFilename(reservedFileName, true);
            // Extensions should be ignored
            checkFilename(reservedFileName + ".tar.gz", true);
            // Non-extension suffixes are ok.
            checkFilename(reservedFileName + "additional_text", false);
        }
    }

    static void checkFilename(String filename, boolean isReserved) {
        boolean isReservedAccordingToAPI = 
FileSystem.WINDOWS.isReservedFileName(filename);
        if (isReserved != isReservedAccordingToAPI) {
            if (isReserved) {
                System.out.printf("'%s' is reserved according to the spec but 
not according to FileSystem.isReservedFileName%n", filename);
            } else {
                System.out.printf("'%s' is not reserved according to the spec 
but is according to FileSystem.isReservedFileName%n", filename);
            }
        } else {
            // Spec and API match
        }
    }
}{code}
 

Link to relevant code:

[https://github.com/apache/commons-io/blob/ec0fd2c98f0bf94d6d87c6adf237430e606e2e23/src/main/java/org/apache/commons/io/FileSystem.java#L91C16-L92C116]

 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to