Как проверить, является ли объект FileInfo потомком DirectoryInfo?Является FileInfo потомком DirectoryInfo
public bool IsFileDescendantOfDirectory(
FileInfo fileInfo,
DirectoryInfo directoryInfo)
{
}
Как проверить, является ли объект FileInfo потомком DirectoryInfo?Является 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;
}
Интересные, вы должны сравнить FullName
, DirectoryInfo.Equals
не работает, как ожидалось поскольку он использует Object.Equals
, который просто сравнивает ссылки.
В чем преимущество перед сравнением путей, чтобы проверить, начинается ли путь к файлу с пути к каталогу? – samy
@samy: Каталог: 'C: \ Dir1 \ Subdir' Файл:' C: \ Dir1 \ Subdir.txt'. Файл не находится в каталоге или в одном из его родительских директив, но 'StartsWith' возвращает true. Я думаю, вы также можете использовать строковые методы. Но вы должны обращаться с крайними случаями. Таким образом, imho abbove apporoach более надежный и читаемый. –
Хорошая добыча! Что касается вашего метода, он терпит неудачу с 'IsFileDescendantOfDirectory (новая FileInfo (@" C: \ temp \ file.txt "), новая DirectoryInfo (@" c: \ temp \ ")). Любая идея почему? – samy
FileInfo предоставляет каталог Directory через его свойство Directory, а DirectoryInfo предоставляет свойство Parent. Так просто;
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);
}
После некоторого назад и вперед с Тимом 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
, идущий вверх по каталогам, будет пустой тратой проверок, поскольку разница находится в конце пути.
Вы уверены, что операнд = здесь будет работать? Ответ Тима выше преодолевает это, проводя сравнение строк. – divinci
@divinci true, это не работает для adhoc created DirectoryInfos – Rhumborl