[windows] Can't delete a closed file?

Machine Code jckj33 at gmail.com
Fri May 10 19:10:05 UTC 2019


On Thursday, 9 May 2019 at 10:09:23 UTC, Cym13 wrote:
> Hi,
>
> this is likely not related to D itself but hopefully someone 
> can help me with this since I'm rather new to windows 
> programming, I mainly work on linux. I'm trying to bundle a DLL 
> in a binary, write it in a temp folder, use it and remove the 
> dangling file.
>
> So far I have the following file:
>
>     import std;
>
>     void main(string[] args) {
>         import core.runtime;
>         static immutable libcurl = import("libcurl.dll");
>
>         import std.file: write;
>         auto libpath = tempDir.buildPath("libcurl.dll");
>         libpath.write(libcurl);
>
>         auto libcurlMem = rt_loadLibrary(libpath.toStringz);
>
>         import std.net.curl;
>         "https://dlang.org/".byLine.count.writeln;
>
>         rt_unloadLibrary(libcurlMem);
>         remove(libpath);
>     }
>
> Compiled with:  dmd.exe -Jlibdir test.d
>
> It almost work, I can write, load and use the library, but when 
> it comes to
> removing it nothing works.
>
> std.file.FileException at std\file.d(1045): 
> C:\users\cym13\Temp\libcurl.dll: Access denied.
> ----------------
> 0x00402377 in EntryPoint
> 0x00413BC7 in EntryPoint
> 0x00413B49 in EntryPoint
> 0x004139E3 in EntryPoint
> 0x0040B77F in EntryPoint
> 0x7B4754C2 in call_process_entry
> 0x7B477FC6 in ExitProcess
> 0x7B4754CE in call_process_entry
>
> I tried using an explicit File handle to explicitely close the 
> file after
> writing to it but that doesn't change anything.
>
> I'm pretty sure I'm missing something basic about the way 
> windows handles
> open files but I don't know what, could someone explain why 
> this doesn't work
> the way I expect it to?

Well, I've had similar issue. The error message says "access 
denied" which I believe refers to the tmp directory; i.e, the 
user that is running your executable has no permissions to delete 
that file. To be honest, I find all the permissions issues on 
Windows a pain the pass so I did a simple tmp files manager. My 
application create a tmp folder in same folder as in the 
executable's directory then delete it when the application 
finishs.
I also did write my own function to geneate a random string meant 
to be used as tmp filename.

To delete the file, it might be finishing something and the OS 
may hold it for some while; so try to delete the file a couple of 
times, with some interval between the attemps, I do something 
like this:

void deleteFile(string filename)
{
	import std.file : remove, FileException;

	enum int nAttempts = 5;
	enum int interval = 200; // value in ms

	int n = nAttempts;
	do
	{
		try
		{
			remove(filename);
		}
		catch(FileException)
		{
			// the file may be temporary busy or something, so we try 
again after a while, few times.
			sleep(interval);
		}
	} while(n --> 0);
}



More information about the Digitalmars-d-learn mailing list