www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - mkdir; remove; under Windows throw Exception

reply unDEFER <undefer gmail.com> writes:
Hello!

$ cat try.d
import std.file;

void main ()
{
         mkdir("D:\\TEST");
         remove("D:\\TEST");
}

$ ./try.exe

std.file.FileException std\file.d(731): D:\TEST: Access Denied.
----------------
....


What I don't know about removing directories in Windows?
Why I can't remove directory which just time created?
Dec 09 2016
next sibling parent reply SonicFreak94 <sonicfreak94 hotmail.com> writes:
On Saturday, 10 December 2016 at 01:19:45 UTC, unDEFER wrote:
         remove("D:\\TEST");
Try rmdir instead.
Dec 09 2016
parent reply unDEFER <undefer gmail.com> writes:
On Saturday, 10 December 2016 at 01:28:13 UTC, SonicFreak94 wrote:
 On Saturday, 10 December 2016 at 01:19:45 UTC, unDEFER wrote:
         remove("D:\\TEST");
Try rmdir instead.
But it works under Linux
Dec 09 2016
parent reply Adam D. Ruppe <destructionator gmail.com> writes:
On Saturday, 10 December 2016 at 03:29:18 UTC, unDEFER wrote:
 But it works under Linux
That's just because the underlying C function handles the case. But the D function makes no promises about that: std.file.remove's documentation says "removes the file", leaving what it does to directories undefined. Interestingly, the Linux kernel *does* make the distinction: the C remove function on Linux does a test then calls unlink or rmdir based on if it is a directory or not. But it didn't always do that. But what you have is undefined behavior - the function is only guaranteed to work on files, and does not specify if it will work or be an error on directories.
Dec 09 2016
parent unDEFER <undefer gmail.com> writes:
On Saturday, 10 December 2016 at 03:36:11 UTC, Adam D. Ruppe 
wrote:
 On Saturday, 10 December 2016 at 03:29:18 UTC, unDEFER wrote:
 But it works under Linux
That's just because the underlying C function handles the case. But the D function makes no promises about that: std.file.remove's documentation says "removes the file", leaving what it does to directories undefined. Interestingly, the Linux kernel *does* make the distinction: the C remove function on Linux does a test then calls unlink or rmdir based on if it is a directory or not. But it didn't always do that. But what you have is undefined behavior - the function is only guaranteed to work on files, and does not specify if it will work or be an error on directories.
Thank you, but I think in this case D must use unlink for implementation remove.
Dec 09 2016
prev sibling parent reply Jonathan M Davis via Digitalmars-d-learn writes:
On Saturday, December 10, 2016 01:19:45 unDEFER via Digitalmars-d-learn 
wrote:
 Hello!

 $ cat try.d
 import std.file;

 void main ()
 {
          mkdir("D:\\TEST");
          remove("D:\\TEST");
 }

 $ ./try.exe

 std.file.FileException std\file.d(731): D:\TEST: Access Denied.
 ----------------
 ....


 What I don't know about removing directories in Windows?
 Why I can't remove directory which just time created?
Well, much as I'd love to rag on Windows for doing dumb and annoying stuff with file locks (which they do do), in this case, your code wouldn't have worked an other OSes either. The problem is that you created a directory and then used a function which removes files. If you want to remove a directory, then use rmdir (or rmdirRecurse if you want to blow away a non-empty directory). - Jonathan M Davis
Dec 09 2016
parent reply unDEFER <undefer gmail.com> writes:
On Saturday, 10 December 2016 at 01:30:52 UTC, Jonathan M Davis 
wrote:
 On Saturday, December 10, 2016 01:19:45 unDEFER via 
 Digitalmars-d-learn wrote:

 Well, much as I'd love to rag on Windows for doing dumb and 
 annoying stuff with file locks (which they do do), in this 
 case, your code wouldn't have worked an other OSes either. The 
 problem is that you created a directory and then used a 
 function which removes files. If you want to remove a 
 directory, then use rmdir (or rmdirRecurse if you want to blow 
 away a non-empty directory).

 - Jonathan M Davis
man remove: remove - remove a file or directory The function which removes only files named unlink. The D must guarantee the same behaviour of remove on all OSes.
Dec 09 2016
parent reply ag0aep6g <anonymous example.com> writes:
On 12/10/2016 04:39 AM, unDEFER wrote:
 man remove:

 remove - remove a file or directory
That's documentation for C, not for D.
 The function which removes only files named unlink.

 The D must guarantee the same behaviour of remove on all OSes.
D has no obligation to follow C in function naming.
Dec 10 2016
parent reply unDEFER <undefer gmail.com> writes:
On Saturday, 10 December 2016 at 14:10:15 UTC, ag0aep6g wrote:
 On 12/10/2016 04:39 AM, unDEFER wrote:
 man remove:

 remove - remove a file or directory
That's documentation for C, not for D.
I know, but why it works in Linux by Linux documentation?
Dec 10 2016
parent reply Adam D. Ruppe <destructionator gmail.com> writes:
On Saturday, 10 December 2016 at 18:09:43 UTC, unDEFER wrote:
 I know, but why it works in Linux by Linux documentation?
Coincidence. That detail is undefined in the D documentation which means the implementation is free to do whatever is easier for it in a platform-specific manner.
Dec 10 2016
parent unDEFER <undefer gmail.com> writes:
On Saturday, 10 December 2016 at 18:30:53 UTC, Adam D. Ruppe 
wrote:
 On Saturday, 10 December 2016 at 18:09:43 UTC, unDEFER wrote:
 I know, but why it works in Linux by Linux documentation?
Coincidence. That detail is undefined in the D documentation which means the implementation is free to do whatever is easier for it in a platform-specific manner.
OH, OK. Undocumented behavior is undocumented behavior...
Dec 10 2016