C#如何检查文件路径中是否包含特定目录

5

当我获得像c:\folder1\a12\somefile.txt这样的路径时,我想检查文件名是否包含目录c:\folder1\a1。

上面的文件名应该返回false。

代码无法访问有关文件系统的信息。它不需要检查文件或文件夹的存在性,只需要遵循文件和目录名称约定即可。

如果代码能处理备用路径分隔符/UNIX路径就更好了。


3
你到目前为止尝试过什么了? - EricLaw
我的代码是在.NET 1.1版本中编写的,而且有太多的if条件语句。我正在寻找.NET 4+中的一些新解决方案,但是没有找到任何快速解决办法。我希望有人已经至少为Windows路径解决了这个问题。 - James
1
你能使用 string.Containsstring.StartsWith 吗? - Mohammad Mirmostafa
4个回答

5

您可以简单地检查文件路径是否以目录路径开头。不要忘记使用分隔符后缀目录路径,以避免误报。

public static bool IsFileBelowDirectory(string fileInfo, string directoryInfo, string separator)
{
    var directoryPath = string.Format("{0}{1}"
    , directoryInfo
    , directoryInfo.EndsWith(separator) ? "": separator);

    return fileInfo.StartsWith(directoryPath, StringComparison.OrdinalIgnoreCase);
}

3
请勿忘记对两侧的分隔符进行标准化。 - Alexei Levenkov
@AlexeiLevenkov是正确的,而且你可能还想仔细看一下OrdinalIgnoreCase参数,因为Unix路径通常是区分大小写的。由你决定,要么将值参数化,要么将其包装在一个根据你的环境构建的类中。 - samy
不考虑父目录符号(..)。此外,您应该使用Path.TrimEndingDirectorySeparator而不是仅为分隔符设置参数。 这里有另一个解决方案(带有ignoreCase,一个布尔参数): Path.GetFullPath(fileInfo).StartsWith(Path.GetFullPath(directoryInfo), ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal); - Scover

2

这对您有用吗?

public bool isSubDir(string parentPath, string childPath)
{
    var parentUri = new Uri(parentPath);
    var childUri = new DirectoryInfo(childPath).Parent;
    while(childUri != null)
    {
        if(new Uri(childUri.FullName) == parentUri)
        {
            return true ;
        }
        childUri = childUri.Parent;
    }
    return false;
}

2
我认为最好的方法是使用string.Contains()来检查完整路径是否包含您想要的文件夹。
public static bool IsUnderDirectory(string fullpath, string directoryName)
{
   return fullpath.Contains(string.Format(@"{0}\",directoryName));
}

我希望你能够受益于此。

1
这适用于Windows文件夹。只需要确保没有尾随分隔符即可。 - James

1

我认为类似这样的方式可以适用于Windows和Unix风格的路径,并且不依赖于实际存在的文件/目录。

string someFile = @"/var/folder1/a12/somefile.txt";
// true
Console.WriteLine("Contains?: {0}", someFile.ContainsSubPath(@"/var/folder1/a12/"));
// false
Console.WriteLine("Contains?: {0}", someFile.ContainsSubPath(@"/var/folder1/a1/"));

// windows style
someFile = @"c:\folder1\a12\somefile.txt";
// true
Console.WriteLine("Contains?: {0}", someFile.ContainsSubPath(@"c:\folder1\a12\"));
// false
Console.WriteLine("Contains?: {0}", someFile.ContainsSubPath(@"c:\folder1\a1\"));

这里是扩展方法的代码:

public static bool ContainsSubPath(this string pathToFile, string subPath)
{
    pathToFile = Path.GetDirectoryName(pathToFile) + "\\";
    string searchPath = Path.GetDirectoryName(subPath) + "\\";

    bool containsIt = pathToFile.IndexOf(searchPath, StringComparison.OrdinalIgnoreCase) > -1;

    return containsIt;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接