Как осуществить отмену процесса удаления папок, файлов с ПК с восстановлением удаленной информации в C #? - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь создать свой собственный мини-файловый менеджер в Windows Forms для учебных целей.

Может кто-нибудь подсказать, пожалуйста, как реализовать отмену процесса удаления папок, файлов с ПК с восстановлениемудалил информацию в C #?(индикатор выполнения работает и когда вы нажимаете кнопку отмены)

private void DeleteBtn_Click(object sender, EventArgs e)
{
        DirectoryInfo[] checkeDirectoryInfos = NodesManager.GetCheckedNodes(SourceFilesTree);

        if (MessageBox.Show("Are you sure you want permanently delete this items?", "Delete", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK)
        {
            FileManager.DeleteMethod(checkeDirectoryInfos);

            foreach (TreeNode item in NodesManager.GetCheckedTreeNodes(SourceFilesTree))
            {
                item.Remove();
            }
        }
}

// this is from NodesManager class.
private static IEnumerable<TreeNode> CheckedNodes(TreeNodeCollection nodes)
{
        foreach (TreeNode node in nodes)
        {
            // Yield this node.
            if (node.Checked)
            {
                if (!node.Parent.Checked) //if the parent is checked we don't return the children (because they are selected by default)
                {
                    yield return node;
                }
            }

            // Yield the checked descendants of this node.
            foreach (TreeNode checkedChild in CheckedNodes(node.Nodes))
                yield return checkedChild;
        }
 }

 // Return a list of the checked TreeView nodes.
 private static IEnumerable<TreeNode> CheckedNodes(TreeView trv)
 {
     return CheckedNodes(trv.Nodes);
 }

 public static DirectoryInfo[] GetCheckedNodes(TreeView tree)
 {
     return CheckedNodes(tree)
               .Select(node =>
                {
                     DirectoryInfo file = new DirectoryInfo(GetParentString(node));
                     return file;
                }).ToArray();
 }

 public static string GetParentString(TreeNode node)
 {
        if (node.Parent == null)
        {
            return node.Text;
        }

        return GetParentString(node.Parent) + node.Text + (node.Nodes.Count > 0 ? @"\" : string.Empty);
}

Метод удаления

public static void DeleteMethod(DirectoryInfo[] directories)
{
        foreach (DirectoryInfo dir in directories)
        {
            if ((dir.Attributes & FileAttributes.Directory) != 0) //check if its a folder
            {
                try
                {
                    dir.Delete(true);
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }
            else // if it is a file
            {
                FileInfo file = new FileInfo(dir.FullName);

                try
                {
                    file.Delete();
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }
        }

        MessageBox.Show("Delete complete", "MiniFileManager",MessageBoxButtons.OK, MessageBoxIcon.Information);
}

Это все без формы окна ProgressBar, но я хочу знать идеюкак это реализовать и как это должно работать (возможно, используя TPL с токеном отмены)

1 Ответ

0 голосов
/ 26 ноября 2018

Учитывая отмену, обычно это делается в C # с токенами отмены .

Что касается восстановления, в чистом C # нет встроенного решения.Вы должны будете переместить файл в свою пользовательскую папку, которая будет действовать как корзина вместо того, чтобы удалять их, если вы хотите восстановить их.Вы можете использовать Shell Win32 API, где вы можете удалить файлы в корзину и восстановить их.Но вам нужно использовать P / Invoke для доступа к Win32 API, и это становится довольно сложным, что, кажется, не то, что вы хотите делать.Также вы можете рассмотреть UWP, так как C # поддерживает удаление в корзину, но в настоящее время нет способа восстановить его.

...