www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Can't call isDir on linux on const object

reply "Spacen" <spacen razemail.com> writes:
The same code works on windows DMD 1.65. But on linux:

delold.d(54): Error: mutable method std.file.DirEntry.isDir is 
not callable using
a const object

[code]
bool printFile(in DirEntry dirEntry, in Duration age, Options 
options)
{
     immutable string type = dirEntry.isDir ? "directory" : 
dirEntry.isFile ? "file" : "unknown";
     if (!options.beQuiet)
         writefln("%s %s, %s is %s days old", type, dirEntry.name,
         dirEntry.timeLastModified, age.total!"days");
     return true;
}
[/code]
May 19 2014
parent reply "Adam D. Ruppe" <destructionator gmail.com> writes:
On Monday, 19 May 2014 at 20:11:45 UTC, Spacen wrote:
 The same code works on windows DMD 1.65. But on linux:
It's because of caching. isDir on Linux calls a function with this comment: /++ This is to support lazy evaluation, because doing stat's is expensive and not always needed. Try both stat and lstat for isFile and isDir to detect broken symlinks. +/ void _ensureStatOrLStatDone() Simple solution is to just take a plain DirEntry instead of "in DirEntry" so it isn't const.
May 19 2014
parent "Spacen" <spacen razemail.com> writes:
On Monday, 19 May 2014 at 20:18:40 UTC, Adam D. Ruppe wrote:
 On Monday, 19 May 2014 at 20:11:45 UTC, Spacen wrote:
 The same code works on windows DMD 1.65. But on linux:
It's because of caching. isDir on Linux calls a function with this comment: /++ This is to support lazy evaluation, because doing stat's is expensive and not always needed. Try both stat and lstat for isFile and isDir to detect broken symlinks. +/ void _ensureStatOrLStatDone() Simple solution is to just take a plain DirEntry instead of "in DirEntry" so it isn't const.
Thanks Adam. Nice and portable then.
May 19 2014