Как мне просматривать только каталоги, содержащие PDF-файлы с атрибутом ReadOnly, в моем C# TreeView? - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть TreeView в моей форме C#, и я хочу, чтобы отображал только каталоги, содержащие PDF, которые не предназначены только для чтения. Файлы также должны отображаться.

Мой текущий код:

private static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo)
    {
        var directoryNode = new TreeNode(directoryInfo.Name);
        foreach (var directory in directoryInfo.GetDirectories())
            directoryNode.Nodes.Add(CreateDirectoryNode(directory));
        foreach (var file in directoryInfo.GetFiles("*.pdf"))
            directoryNode.Nodes.Add(new TreeNode(file.Name));
        return directoryNode;
    }

Что я знаю на данный момент:

  • Проверка, доступна ли она только для чтения ((attributes & FileAttributes.ReadOnly) != FileAttributes.ReadOnly) == true
  • Я знаю, что файл может иметь следующие атрибуты: ReadOnly(R), Hidden(H), Archived(A), System(S), но я не уверен, как их использовать.

Заранее спасибо.

1 Ответ

0 голосов
/ 10 апреля 2020

Ваш лог 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;
}
...