我有一份遗产.NET应用程序,我已将其移植到.NET 6.0和am执行跨平台(Windows和Linux).

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

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

我已经转变成了

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

我想防止任何开发人员再次意外或有目的地在硬编码路径中添加\项.除了在代码评审时处理这个问题,还有没有一种方法可以让我自动做到这一点,或者通过代码分析,或者在测试时出现惊人的失败?我的搜索毫无帮助.

我的 idea

  • 在我的Docker集成测试中修改ext4文件系统,以防止文件名带有\.我不知道这是否可能/合理.
  • 使用my Docker integration tests上的权限进行创作,以防止在根目录中创建文件(从父目录中删除w),但允许在子目录中创建文件(再次将w添加到特定的子目录).这感觉超脆.
  • 查找或编写一个分析器来查看字符串,并对任何包含\字符的字符串进行投诉.

有更好的办法吗?

推荐答案

由于在开发或执行时没有一种内置的方法来防止这种情况,所以我将添加这段代码,以便在集成测试之后运行.它将扫描文件系统,如果发现创建的任何文件或目录的字符不正确(反斜杠),则抛出异常.

我还想添加一个冒号判断,以防人们创建像"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");
        });
}

.net相关问答推荐

无法在Ubuntu 22.04.3上运行带有Rider 2023和DotNet-8.0的项目

如何在AutoMapper中添加自定义方法到项目中?

获取Ef-Core集合的DeleteBehavior

NETSDK1083:无法识别指定的 RuntimeIdentifierwin10-x64

如何将多个安装程序Bundle 到一个安装程序中?

Puppeteer LaunchAsync 在未打开浏览器的情况下挂起

为什么这个同步运行的异步睡眠会挂起?

每当属性值发生变化时引发事件?

MongoDB C# 驱动程序 - 忽略绑定字段

将客户端证书添加到 .NET Core HttpClient

C# 时间跨度毫秒与 TotalMilliseconds

你如何调试 MVC 4 API 路由?

为什么 System.Timers.Timer 能在 GC 中存活,而 System.Threading.Timer 不能?

Linq to SQL - 返回前 n 行

静态方法继承的正确替代方法是什么?

确定使用 ContextMenuStrip 的控件

为什么甚至可以更改私有成员,或使用反射在 C# 中运行私有方法?

将 SignalR 2.0 .NET 客户端重新连接到服务器集线器的最佳实践

如何修改 KeyValuePair 值?

如何卸载Microsoft .NET Core 1.0.0 RC2 - VS 2015 Tooling Preview 1?