Setting FILE_DISPOSITION_POSIX_SEMANTICS when deleting files on Windows

Luke Hutchison luke.hutch at gmail.com
Mon May 6 23:57:29 UTC 2019


Recent Windows 10 builds support POSIX-style file deletion semantics:

https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/ntddk/ns-ntddk-_file_disposition_information_ex

Setting this bit before deleting files using File::delete, Files::delete,
Files::deleteIfExists etc. will work around the common problem on Windows
where an attempt to delete an open file silently fails. This is a very
common problem, experienced by developers when they forget to close not
just any open OutputStream on a file before attempting to delete it, but
also any open InputStream.

This problem is exacerbated by the fact that a file cannot be deleted if it
is mmap'd, and a file cannot be safely forcibly unmapped until it is
garbage collected:

https://bugs.openjdk.java.net/browse/JDK-4724038

Since file locking and deletion semantics are different on Windows than
Linux and Mac OS X, and since the silent failure of file deletion when a
file is open is almost always a source of surprise to developers coming
from the Linux or Mac OS X world, the lack of default POSIX file deletion
semantics on Windows presents a portability issue.

I propose the FILE_DISPOSITION_POSIX_SEMANTICS bit be set for all delete
operations in the Windows build of Java, to unify file deletion semantics
across operating systems.


More information about the jdk-dev mailing list