On 3/19/19, Victor Stinner <vstin...@redhat.com> wrote: > > When I write tests, I don't really care of security, but > NamedTemporaryFile caused me many troubles on Windows: you cannot > delete a file if it's still open in a another program. It's way more > convenient to use tempfile.mktemp().
Opening the file again for normal access is problematic. NamedTemporaryFile opens it with delete access, but Python's open() function doesn't support delete-access sharing unless an opener is used that calls CreateFileW. NamedTemporaryFile does open files with delete-access sharing, so any process can delete the file if it's allowed by the file's security and attributes. You may be thinking of unlinking. In Windows versions prior to 10, that's always a two-step process. A file with its delete disposition set doesn't get unlinked until all references for all open instances are closed. In Windows 10 (release 1709+), we have the option of using SetFileInformationByHandle: FileDispositionInfoEx (21) with FILE_DISPOSITION_FLAG_POSIX_SEMANTICS (2) and FILE_DISPOSITION_FLAG_DELETE (1). The online documentation hasn't been updated to include this, but it's supported in the headers for _WIN32_WINNT_WIN10_RS1 and later. This operation unlinks the file as soon as we close our handle, even if it has existing references. This is explained in the remarks for the underlying NT system call [1]. In particular this resolves the race condition related to handles opened by anti-malware programs. It may be worth adding support for deleting files by handle that tries FileDispositionInfoEx in 1709+. This will work in about half of all Windows systems. (About 40% still run Windows 7.) It's not a panacea for Windows file-deleting woes. We still need to be able to open the file with delete access, which requires existing opens to share delete access. [1]: https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/ntddk/ns-ntddk-_file_disposition_information_ex _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com