Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FileInfo是DirectoryInfo的后代吗_C#_.net_Fileinfo_Directoryinfo - Fatal编程技术网

C# FileInfo是DirectoryInfo的后代吗

C# FileInfo是DirectoryInfo的后代吗,c#,.net,fileinfo,directoryinfo,C#,.net,Fileinfo,Directoryinfo,如何检查FileInfo对象是否是DirectoryInfo的后代 public bool IsFileDescendantOfDirectory( FileInfo fileInfo, DirectoryInfo directoryInfo) { } 如果您想查找名称,这将是一个简单的解决方案: Directory .EnumerateFiles(di.FullName, *.*, SearchOption.AllDirectories) .Any(x => x ==

如何检查FileInfo对象是否是DirectoryInfo的后代

public bool IsFileDescendantOfDirectory(
    FileInfo fileInfo,
    DirectoryInfo directoryInfo)
{

}

如果您想查找名称,这将是一个简单的解决方案:

Directory
.EnumerateFiles(di.FullName, *.*, SearchOption.AllDirectories)
.Any(x => x == fileInfo.FullName);

您可以检查文件的父级,直到找到匹配的目录。这将比在目录中搜索文件更快:

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;
}

您可以浏览父目录:

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;
}

有趣的是,您必须比较全名DirectoryInfo.Equals,因为它使用了Object.Equals,它只比较引用。

FileInfo通过其Directory属性提供DirectoryInfo,DirectoryInfo提供父属性。如此公正

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);
    }

在与Tim Schmelter反复讨论之后,我确信以下方法对于确定FileInfo路径是否位于DirectoryInfo路径下是有效的:


有趣的是,您不需要遍历目录来检查每个级别的质量。当文件明显不在目录中时,这可以节省一些时间;例如,对于目录C:\this\is\a\path\that\is\long和文件C:\this\is\a\path\that\is\allow\long.txt,在目录上遍历将浪费检查时间,因为差异在路径的末尾。

您确定=操作数在这里有效吗?Tim在上面的回答是通过字符串比较来解决这个问题的。@divinci true,这对临时创建的DirectoryInfos不起作用。与比较路径来检查文件路径是否以目录路径开头相比,有什么好处?@samy:directory:C:\Dir1\Subdir file:C:\Dir1\Subdir.txt。该文件不在目录或其父目录中,但StartsWith返回true。我想你也可以使用字符串方法。但你必须处理边缘案件。因此,imho abbove Approach更健壮,可读性更强。捕捉得好!关于您的方法,它在ISFileDegenantofDirectoryNew中失败FileInfo@C:\temp\file.txt,新建DirectoryInfo@c:\temp\。知道为什么吗?好的,找到了为什么,最终\没有被DirectoryInfo全名清除property@samy:你说得对,说得好。这似乎是一个尚未修复的bug:我已经编辑了答案以删除它们。
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);
}