将路径限制在文件夹内

Constraint a path to be within a folder

假设您想将文件存储在文件夹中 C:\A\B\C 并让用户提供文件名。

把它们结合起来,对吗?

错了。

如果用户选择 \..\..\Ha.txt you might be in for a surprise.

那么我们如何将结果限制在 C:\A\B\C 以内呢?如果它在子文件夹中就可以了,只是不要超过它。

如果您要文件名,那么它应该只是文件名。您授予用户对子目录的控制权越多,他们就越能打扰您。


这里的想法是用两个可能的斜线(/\)分割您的路径,并查看数组中任何条目的值是否为 ..

string input = @"\..\..\Ha.txt";
bool containsBadSegments = input
    .Split(new [] { '/', '\' })
    .Any(s => s is "..");

这个答案只负责检测路径中的 \..\。还有很多其他方法可以输入错误的值,例如 OS 的文件系统不允许的字符,或者绝对路径或根路径。

我用过我的一个测试项目,真的没关系:

使用 c#10

internal class Program
{
    static void Main(string[] args)
    {
        string template = @"F:\Projectes\Test\SourceGenerators";
        string folder = @"..\..\..\..\Test1.sln";

        Console.WriteLine(MatchDirectoryStructure(template, folder) 
                          ? "Match" 
                          : "Doesn't match");
    }

    static bool MatchDirectoryStructure(string template, string folder) 
        => new DirectoryInfo(folder).FullName.StartsWith(template);
}

如您所见,new DirectoryInfo(fileName).FullName; returns目录的真实名称。

从这里您可以检查它是否与所需结果匹配。

在这种情况下,返回值为:

Match