FileInfo是DirectoryInfo的子代吗
本文关键字:DirectoryInfo FileInfo | 更新日期: 2023-09-27 18:24:06
如何检查FileInfo对象是否是DirectoryInfo的后代?
public bool IsFileDescendantOfDirectory(
FileInfo fileInfo,
DirectoryInfo directoryInfo)
{
}
您可以浏览父目录:
public static bool IsFileDescendantOfDirectory(FileInfo fileInfo, DirectoryInfo directoryInfo)
{
// https://connect.microsoft.com/VisualStudio/feedback/details/777308/inconsistent-behavior-of-fullname-when-provided-path-ends-with-a-backslash
string path = directoryInfo.FullName.TrimEnd(Path.DirectorySeparatorChar);
DirectoryInfo dir = fileInfo.Directory;
while (dir != null)
{
if (dir.FullName.TrimEnd(Path.DirectorySeparatorChar).Equals(path, StringComparison.OrdinalIgnoreCase))
return true;
dir = dir.Parent;
}
return false;
}
有趣的是,您必须比较FullName
,DirectoryInfo.Equals
不能按预期工作,因为它使用的是仅比较引用的Object.Equals
。
您可以检查文件的父级,直到它到达匹配的目录。这将比在目录中搜索文件更快:
public bool IsFileDescendantOfDirectory(DirectoryInfo directoryInfo, FileInfo fileInfo)
{
DirectoryInfo d = fileInfo.Directory;
do
{
if (d.FullName.Equals(directoryInfo.FullName, StringComparison.OrdinalIgnoreCase))
{
return true;
}
d = d.Parent;
}
while(d != null);
return false;
}
经过与Tim Schmelter的反复讨论,我确信以下方法对于确定FileInfo
路径是否位于DirectoryInfo
路径下是有效的:
public static bool IsFileBelowDirectory(FileInfo fileInfo, DirectoryInfo directoryInfo)
{
var separator = Path.DirectorySeparatorChar.ToString();
var directoryPath = string.Format("{0}{1}"
, directoryInfo.FullName
, directoryInfo.FullName.EndsWith(separator) ? "": separator);
return fileInfo.FullName.StartsWith(directoryPath, StringComparison.OrdinalIgnoreCase);
}
有趣的是,您不需要遍历目录来检查每个级别的质量。当您的文件显然不在目录中时,这样可以节省一些时间;例如对于目录CCD_ 6和文件CCD_。
如果你想查找名称,这将是一个简单的解决方案:
Directory
.EnumerateFiles(di.FullName, *.*, SearchOption.AllDirectories)
.Any(x => x == fileInfo.FullName);
DirectoryInfo fileOwner = myFileInfo.Directory;
do
{
if(fileOwner == mySampleDirectory) Debug.WriteLine("Yes !");
fileOwner = fileOwner.Parent;
}
while(fileOwner != null)
这就足够了:
public static bool IsDirectoryParent(DirectoryInfo directoryInfo, DirectoryInfo parentInfo)
{
if (!directoryInfo.Name.StartsWith(parentInfo.FullName))
return false;
return directoryInfo.FullName == parentInfo.FullName
|| IsDirectoryParent(directoryInfo.Parent, parentInfo);
}
public bool IsFileParent(FileInfo fileInfo, DirectoryInfo directoryInfo)
{
return IsDirectoryParent(fileInfo.Directory, directoryInfo);
}