tangent icon

Proof that Windows can in fact create a NUL file

tangent | PRO | 08/24/16 07:06:09 AM UTC | 0 ⭐ | 11665 👁️ | Never ⏰ | []
C++ (WinAPI) |

0 B

|

None

|

0 👍

/

0 👎

#include <stdio.h>
#include <windows.h>
#include <tchar.h>
 
int main()
{
    TCHAR cwd[32768];
    GetCurrentDirectory(sizeof(cwd) / sizeof(TCHAR) - 1, cwd);
 
    // Build the path to NUL.  Flip the flag below to see it fail.
    TCHAR path[sizeof(cwd)];
#if 1
    _stprintf(path, "\\\\?\\%s\\NUL", cwd);
#else
    _tcscpy(path, "NUL");
#endif
 
    // Create the file, if it doesn't exist yet
    HANDLE h = CreateFile(path, GENERIC_WRITE, 0, 0, 
                  CREATE_ALWAYS, 0, 0);
    if (h != INVALID_HANDLE_VALUE) {
        // Write our test string to the file.  If the flag above is 1
        // and you try to open this file with Explorer or cmd.exe, it
        // will fail, but you *can* open it with, say, Cygwin, because
        // Cygwin opens files via a full path like the one we use in the
        // "1" case above, bypassing the NUL path name special case code
        // inside the Windows kernel.
        LPTSTR s = _T("booga, booga!\n");
        DWORD nWritten, nExpected = _tcslen(s) * sizeof(TCHAR);
        if (WriteFile(h, s, nExpected, &nWritten, 0)) {
            _tprintf("Wrote %d bytes to %s.\n", nWritten, path);
        }
        CloseHandle(h);
    }
    else {
        // This shouldn't happen, even if you flip the flag above.  The
        // "0" case doesn't cause an error, it just sends the written
        // bytes to the bit bicket, emulating Unix's /dev/null.
        LPTSTR errorText = 0;
        FormatMessage(
            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_ALLOCATE_BUFFER |
            FORMAT_MESSAGE_IGNORE_INSERTS,  
            0, 
            GetLastError(),
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR)&errorText, 
            0,
            0);
        _tprintf("Failed to create NUL: error %s\n", errorText);
    }
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎