On 09/19/2018 02:26 AM, Vladimir Panteleev wrote:
On Wednesday, 19 September 2018 at 05:49:41 UTC, Nick Sabalausky (Abscissa) wrote:
[...]

Someone mentioned in this thread that .NET runtime does do the long-path workaround automatically. One thing we could do is copy EXACTLY what C# is doing.


This is a complete textbook example of the "appeal to authority" fallacy.

If an approach is valid, then it stands on its own merits regardless of whether or not Microsoft implemented it.

If an approach in invalid, then it fails on its own demerits regardless of whether or not Microsoft implemented it.

What MS has or hasn't implemented and released is completely irrelevant WRT validity and correctness.

What it *might* be useful for is as a starting point for further exploration. But that is all.

However, there are still drawbacks to this:

- There is still the matter of overhead (one OS API call (GetCurrentDirectory) and at least one GC allocation (for the current directory buffer)).

If one extra OS API call + allocation per std.file API call is unacceptable, then explain how it is unacceptable. I disagree that it is significant enough to be unacceptable.

If a user needs to optimize their already-working-for-all-accepted-inputs application, then they are free to do so. I argue that building this into the standard library's default behaviour amounts to mandatory premature optimization, prioritizing premature optimization over correctness. Prove me wrong.

- Using paths longer than MAX_PATH is an exceptional situation. Putting the workaround in the main code path penalizes 99.9% of use cases.

I have many filepaths on my system right now which exceed MAX_PATH in total length. I submit that this "penalty" you speak of is nothing more than a trivial performance boost at the expense of correctness. Furthermore, I submit that long paths which need extra optimization are MORE exceptional than long paths which do NOT need extra optimization.

- The registry switch in newer Windows versions removes the need for this workaround, so systems with it enabled are penalized as well.

Using the Phobos-based workaround on a system WITH the longpath setting supported and enabled results in slightly reduced performance (which can be overridden and optimized when necessary). Note that it is possible (and very simple) to detect this situation and handle it optimally by skipping the workaround.

OTOH, NOT using the Phobos-based workaround on a system where the longpath setting is NOT supported *OR* NOT enabled results in erroneous behavior. Not something as trivial as slightly-degraded performance on IO access.

The superior default is clear: Use the workaround except where the workaround in known to be safe to omit.

- There is still the matter regarding special filenames,

If you're referring to NUL, COM1, COM2, etc, then this is completely orthogonal.

as well as whet her the expected behavior is really to succeed and create paths inaccessible to most software, instead of failing.

Ok, suppose we decide "Sure, we have reason to believe there may be a significant amount of software on Windows which fails to handle long paths and we want to ensure maximum compatibility with those admittedly broken programs." That's fine. I can get behind that. HOWEVER, that does NOT mean we should leave our APIs as they are, because currently, our APIs fail at that goal. Instead, what it really means is that our APIs should be designed to *REJECT* long paths with an appropriately meaningful error message - and a reasonable workaround - and NOT to blindly just pass them along as they currently do.

Either way, Phobos needs changed:

Do you believe D should prevent its own software from being broken on long paths? Then Phobos should be modified to detect and fix long paths.

Do you believe D should permit breakage on long paths and encourage its programs to play nicely with other non-D Windows software that is *also* broken on long paths? Then Phobos should be modified to detect and *reject* long paths.

Either way, the current Phobos behavior is clearly the worst of both worlds and needs modification.

Reply via email to