防止在 .NET 上构建路径中的反斜杠以进行跨平台部署

Preventing backslash in path building on .NET for cross platform deploy

我有一个遗留的 .NET 应用程序,我已经移植到 .NET 6.0 并且正在执行跨平台(Windows & Linux)。

许多遗留代码是通过硬编码路径创建开发的,在字符串中使用反斜杠,例如

new StreamWriter(FeuxBarreFolderName + @"\JazzSchmazz.txt");

我已经转换成

new StreamWriter(Path.Combine(FeuxBarreFolderName, "JazzSchmazz.txt"));

我想防止任何开发人员无意或有意地再次在硬编码路径中添加 \。除了在代码审查时处理这个问题之外,有没有一种方法可以让我自动执行此操作,无论是通过代码分析还是在测试时出现严重的失败?我的搜索没有帮助。

我的想法

这里有更好的方法吗?

由于在开发或执行时没有内置的方法来防止这种情况,我将在集成测试后将此代码添加到 运行。如果发现任何使用不当字符(反斜杠)创建的文件或目录,它将扫描文件系统并抛出异常。

我也想添加一个冒号检查,以防人们创建像“c:\feux\barre.txt”这样的路径,但看起来至少 NuGet 会创建带有冒号的目录(例如 ~/.local/share/NuGet/v3-cache/670c1461c29885f9aa22c281d8b7da90845b38e4$ps:_api.nuget.org_v3_index.json)

void walkTree(System.IO.DirectoryInfo dirInfo, Action<System.IO.FileSystemInfo> action)
{
    try
    {
        foreach (var file in dirInfo.GetFiles())
            action(file);
    }
    catch (System.IO.DirectoryNotFoundException)
    { }

    try
    {
        foreach (var subdir in dirInfo.GetDirectories())
        {
            action(subdir);
            walkTree(subdir, action);
        }
    }
    catch (System.UnauthorizedAccessException)
    { }
    catch (System.IO.DirectoryNotFoundException)
    { }
    catch (System.Security.SecurityException)
    { }
}

foreach (var drive in System.Environment.GetLogicalDrives())
{
    var driveInfo = new System.IO.DriveInfo(drive);

    if (!driveInfo.IsReady)
        continue;
    walkTree(driveInfo.RootDirectory,
        (FileSystemInfo fi) =>
        {
            if (fi.Name.Contains('\'))
                throw new InvalidOperationException($"'{fi.FullName}' was created with an inappropriate character");
        });
}