我有一份遗产.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相关问答推荐

为什么DotNet新的webapi;命令会为我生成不同的文件夹

.NET 7.0中的UseHttpsRedirection和IIS生产部署

IIS 发布 ASP.NET Core 应用程序而不关闭 IIS 网站

在 C# 中,如何使用泛型的基类将泛型接口的所有实例注入到单个构造函数中?

什么是表达式树,如何使用它们,为什么要使用它们?

如何使用 C# 关键字作为属性名称?

为什么 C# 不允许像 C++ 这样的非成员函数

SqlDateTime.MinValue != DateTime.MinValue,为什么?

有什么方法可以使用 .NET 应用程序使用 git 吗?

如何在 WPF 中创建/制作圆角按钮?

msbuild,定义条件编译符号

Microsoft.Practices.ServiceLocation 来自哪里?

如何对无法加载的 VSTO 插件进行故障排除?

.NET 中是否有可序列化的通用键/值对类?

如何从头开始以编程方式配置 log4net(无配置)

如何获取命名空间中的所有类?

在 .NET 中,null 的哈希码是否应该始终为零

如何从 HashSet 中检索实际项目?

浮动与双重性能

在 .NET 中乘以时间跨度