2014-09-24 3 views

ответ

0

Это было бы простое решение, если вы хотите взглянуть на имена:

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

Вы можете проверить родителей файла, пока он не попадает в соответствующий каталог. Это будет быстрее, чем поиск в каталог для файла:

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

Вы уверены, что операнд = здесь будет работать? Ответ Тима выше преодолевает это, проводя сравнение строк. – divinci

+0

@divinci true, это не работает для adhoc created DirectoryInfos – Rhumborl

4

Вы можете ходить вверх родительские каталоги:

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, который просто сравнивает ссылки.

+0

В чем преимущество перед сравнением путей, чтобы проверить, начинается ли путь к файлу с пути к каталогу? – samy

+0

@samy: Каталог: 'C: \ Dir1 \ Subdir' Файл:' C: \ Dir1 \ Subdir.txt'. Файл не находится в каталоге или в одном из его родительских директив, но 'StartsWith' возвращает true. Я думаю, вы также можете использовать строковые методы. Но вы должны обращаться с крайними случаями. Таким образом, imho abbove apporoach более надежный и читаемый. –

+1

Хорошая добыча! Что касается вашего метода, он терпит неудачу с 'IsFileDescendantOfDirectory (новая FileInfo (@" C: \ temp \ file.txt "), новая DirectoryInfo (@" c: \ temp \ ")). Любая идея почему? – samy

0

FileInfo предоставляет каталог Directory через его свойство Directory, а DirectoryInfo предоставляет свойство Parent. Так просто;

DirectoryInfo fileOwner = myFileInfo.Directory; 
do 
{ 
    if(fileOwner == mySampleDirectory) Debug.WriteLine("Yes !"); 
    fileOwner = fileOwner.Parent; 
} 
while(fileOwner != null) 
-1

Это достаточно:

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

После некоторого назад и вперед с Тимом 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); 
} 

что интересно, что вам не нужно идти до директории, чтобы проверить eaqulity на каждом уровне. Это экономит время, когда ваш файл явно не находится в каталоге; например, для каталога C:\this\is\a\path\that\is\long, а файл C:\this\is\a\path\that\is\also\long.txt, идущий вверх по каталогам, будет пустой тратой проверок, поскольку разница находится в конце пути.

Смежные вопросы