Проект является программой резервного копирования.
У меня два браузера рядом в одной форме (два 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, и это немного похоже на то, чтобы иногда биться головой о стену но у меня есть время на моих руках. Возможно, кто-то здесь может заметить что-то очевидное:)