From 4dc67c027b96d0d75d12c4ec64d7f1e418710c81 Mon Sep 17 00:00:00 2001 From: Qstick Date: Sat, 30 Jan 2021 22:20:39 -0500 Subject: [PATCH] Fixed accounting for zero terminator in long path limitation Fixes #5763 Co-Authored-By: Taloth --- src/NzbDrone.Common/Disk/LongPathSupport.cs | 63 ++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/src/NzbDrone.Common/Disk/LongPathSupport.cs b/src/NzbDrone.Common/Disk/LongPathSupport.cs index ef4bd3f7c..f971175a6 100644 --- a/src/NzbDrone.Common/Disk/LongPathSupport.cs +++ b/src/NzbDrone.Common/Disk/LongPathSupport.cs @@ -1,15 +1,76 @@ -using System; +using System; +using System.IO; +using NzbDrone.Common.EnvironmentInfo; namespace NzbDrone.Common.Disk { public static class LongPathSupport { + private static int MAX_PATH; + private static int MAX_NAME; + public static void Enable() { // Mono has an issue with enabling long path support via app.config. // This works for both mono and .net on Windows. AppContext.SetSwitch("Switch.System.IO.UseLegacyPathHandling", false); AppContext.SetSwitch("Switch.System.IO.BlockLongPaths", false); + + DetectLongPathLimits(); + } + + private static void DetectLongPathLimits() + { + if (!int.TryParse(Environment.GetEnvironmentVariable("MAX_PATH"), out MAX_PATH)) + { + if (OsInfo.IsLinux) + { + MAX_PATH = 4096; + } + else + { + try + { + Path.GetDirectoryName($@"C:\{new string('a', 300)}\ab"); + MAX_PATH = 4096; + } + catch + { + MAX_PATH = 260 - 1; + } + } + } + + if (!int.TryParse(Environment.GetEnvironmentVariable("MAX_NAME"), out MAX_NAME)) + { + MAX_NAME = 255; + } + } + + public static int MaxFilePathLength + { + get + { + if (MAX_PATH == 0) + { + DetectLongPathLimits(); + } + + return MAX_PATH; + } + } + + public static int MaxFileNameLength + { + get + { + if (MAX_NAME == 0) + { + DetectLongPathLimits(); + } + + return MAX_NAME; + } } } }