【问题标题】:See if file path is inside a directory查看文件路径是否在目录中
【发布时间】:2012-07-23 02:48:03
【问题描述】:

如何检查不一定存在的文件的路径是否指向特定目录中的位置?说我有一个方法:

bool IsInside(string path, string folder)
{
    //...
}

那么,如果我这样称呼它:

IsInside("C:\\Users\\Dude\\Hi", "C:\\Users\\Dude\\Hi\\SubFolder\\SubSubFolder\\tile.txt")

应该返回true(注意子文件夹),但如果我这样称呼它:

IsInside("C:\\Users\\Dude\\Hi", "C:\\Users\\Dude\\BadFolder\\SubFolder\\SubSubFolder\\tile.txt")

应该返回 false。我现在唯一能想到的就是使用字符串的StartsWith,但对我来说听起来有点老套。我也没有找到可以检查这个的本地 .NET 方法。

【问题讨论】:

  • 这是愚蠢的还是包括链接之类的东西。
  • 不,这仅适用于本地路径

标签: c# .net


【解决方案1】:

您需要处理相对路径(../../someFile.txt)吗?像这样的东西会起作用:

private bool IsInside(DirectoryInfo path, DirectoryInfo folder)
{
    if (path.Parent == null)
    {
        return false;
    }

    if (String.Equals(path.Parent.FullName, folder.FullName, StringComparison.InvariantCultureIgnoreCase))
    {
        return true;
    }

    return IsInside(path.Parent, folder);
}

然后这样称呼它:

DirectoryInfo folder = new DirectoryInfo("C:\\Users\\Dude\\Hi");
DirectoryInfo path = new DirectoryInfo("C:\\Users\\Dude\\Hi\\SubFolder\\SubSubFolder\\tile.txt");

bool result = IsInside(path, folder);

【讨论】:

    【解决方案2】:

    您可以尝试string.IndexOf 方法。如果您将overloadStringComparison enumeration 一起使用,它应该会为您提供所需的结果。

    从上面的链接:

    报告此字符串中第一次出现一个或多个字符或第一次出现字符串的从零开始的索引。如果在此实例中找不到字符或字符串,则该方法返回 -1。

    bool IsInside(string folder, string path)
    {
       if (path.IndexOf(folder,StringComparison.OrdinalIgnoreCase) != -1)
            return true;
        else
            return false;    
    

    【讨论】:

    • 但是这是区分大小写的。我想知道是否有办法为路径获取某种标准化值,这样相同的路径将始终表示为相同的字符串。
    • @JuanLuisSoldi 在这种情况下,您可以使用 StringComparison 枚举。我将进行编辑。
    猜你喜欢
    • 2015-06-20
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2021-02-20
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多