Переименование папки в моем файловом браузере вызывает IOException - PullRequest
1 голос
/ 02 апреля 2020

Проект является программой резервного копирования.

У меня два браузера рядом в одной форме (два TreeView и два ListView), левый отображает исходные файлы, а правый отображает резервные копии, но когда они не просматривают резервную копию, их можно использовать в качестве файловых браузеров. Когда узлы посещаются в древовидной структуре, в эту папку добавляется FileSystemWatcher (который не просматривает подкаталоги). Я могу переименовывать файлы и папки в виде списка и используя проводник windows, изменения отражаются в обоих, даже если папка выбрана в виде дерева, переименование происходит нормально. Как только я выбираю папку внутри папки, которая должна быть переименована, а затем выбираю папку вне папки, ни просмотр списка, ни Win Explorer больше не могут переименовывать папку, это вызывает IOException.

Пример. ToString читает (dfgdotttd только что от меня пытается переименовать папку много раз):

System.IO.IOException: Доступ к пути 'D: \ Visual Basi c Проекты \ BackUp \ BackUp_01 \ INIT \ Новая папка \ dfgdotttd 'запрещена. в System.IO.Directory.InternalMove (String sourceDirName, String destDirName, Boolean checkHost) в Microsoft.VisualBasi c .FileIO.FileSystem.RenameDirectory (Строковый каталог, String newName) в Microsoft.VisualBasi c .MySerProF. RenameDirectory (каталог String, String newName) в BackUp.Ute.ReNameDir (String OldDir, String NewDirName, Boolean Notify)

OldDir - это «путь и имя» папки, а NewDirName - это просто «новое имя».

Когда я пытаюсь переименовать в Win Explorer, диалоговое окно Windows гласит:

«Используемая папка» Действие не может быть завершено, потому что папка или файл в ней открыт в другая программа Закройте папку или файл и повторите попытку.

Единственный способ исправить это - закрыть браузер и снова открыть его.

Добавление FSW в список (FilesystemWatcher), который инициируется в любом событии TreeViews AfterSelect.

TreeView AfterSelect:

If Not Visited_Nodes_A.Contains(HOSTNode.Name) Then 'Collection of visited nodes for TVA
   Visited_Nodes_A.Add(HOSTNode.Name)
   If Not Visited_Nodes_B.Contains(HOSTNode.Name) Then 'Collection of visited nodes for TVB
       AddWatcher(HOSTNode.Name) 'If folder was visited in other TreeView THEN a Watcher would already have been added.
   End If
End If 'Not Visited_Nodes_A.Contains(HOSTNode.Name)

Добавление FSW '

        Private FileWatchers As New List(Of FileSystemWatcher)
Public Sub AddWatcher(WPath As String, Optional Subffolders As Boolean = False) 'Add new watcher to a newly visited folder
    Dim fsw As New FileSystemWatcher()
    fsw.Path = WPath
    fsw.IncludeSubdirectories = Subffolders
    AddHandler fsw.Changed, AddressOf OnChanged
    AddHandler fsw.Created, AddressOf OnChanged
    AddHandler fsw.Deleted, AddressOf OnChanged
    AddHandler fsw.Renamed, AddressOf OnRenamed : AddHandler fsw.Renamed, AddressOf OnChanged
    fsw.NotifyFilter = (NotifyFilters.FileName Or NotifyFilters.DirectoryName)
    fsw.EnableRaisingEvents = True
    FileWatchers.Add(fsw)
End Sub 'AddWatcher

Я бы показал OnChanged Sub, но это не так уж далеко

Я думаю, это не слишком много для go, но я учу себя в Google et c, и это немного похоже на то, чтобы иногда биться головой о стену но у меня есть время на моих руках. Возможно, кто-то здесь может заметить что-то очевидное:)

...