Ваш лог c имеет небольшой недостаток в добавлении узла каталога без предварительной проверки наличия каких-либо PDF-файлов для чтения / записи.
Учитывая, что могут быть случаи, когда папка содержит все только для чтения pdf-файлы, но одна из его подпапок содержит pdf-файл для чтения / записи, при этом недостаточно проверять, есть ли pdf-файлы для чтения / записи в текущем каталоге:
pdffolder
pdf1 (read-write)
pdf2 (read-write)
sub1 (folder)
pdf3 (read-only)
sub1-1 (folder)
pdf4 (read-write)
В этом случае мы по-прежнему хотим, чтобы sub1 был видимым, а pdf3 скрытым, потому что мы хотим, чтобы папка sub1-1 была доступна (потому что под ней есть pdf4)
Вот ваш новый метод. Существует только одно критическое изменение: теперь этот метод может возвращать значение NULL, если под ним и в каких-либо подпапках его нет чтения / записи.
Надеюсь, это поможет.
private static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo)
{
TreeNode directoryNode = null;
// First, check if there are any read/write files in this folder
// and create the directory node if yes, and add the pdf file node too.
foreach (FileInfo file in directoryInfo.GetFiles("*.pdf"))
{
if (!File.GetAttributes(file.FullName).HasFlag(FileAttributes.ReadOnly))
{
if (directoryNode == null)
{
directoryNode = new TreeNode(directoryInfo.Name);
}
directoryNode.Nodes.Add(new TreeNode(file.Name));
}
}
// There can be no writeable pdf files, but we should still check
// the sub directories for the existence of a writeable pdf file
// because even if this directory does not have one, a sub directory may,
// and in that case we want that pdf file to be accessible.
foreach (DirectoryInfo directory in directoryInfo.GetDirectories())
{
TreeNode subDirectoryNode = CreateDirectoryNode(directory);
// the sub directory node could be null if there are no writable
// pdf files directly under it. Create, if one of the sub directories
// have one.
if (subDirectoryNode != null)
{
if (directoryNode == null)
{
directoryNode = new TreeNode(directoryInfo.Name);
}
directoryNode.Nodes.Add(subDirectoryNode);
}
}
// The return value is null only if neither this directory
// nor any of its sub directories have any writeable pdf files
return directoryNode;
}