Kats2512 Ответов: 3

Удалите файл, используемый другим процессом с помощью VB.net-что?


Привет,

Я написал некоторый код для удаления списка файлов из определенных папок на моем компьютере.

Я столкнулся с небольшой проблемой, когда файл открыт другим процессом, и он не может быть удален.

Кто-нибудь знает какой-нибудь vb-код, который помог бы решить эту проблему, с которой я столкнулся?

Вот мой код ниже:

Try
              Dim F2 As Short = FreeFile()
              For Each foundFile2 As String In My.Computer.FileSystem.GetFiles( _
                  "myfilepath", FileIO.SearchOption.SearchAllSubDirectories, "*.*")
                  FileOpen(F2, foundFile2, OpenMode.Binary, OpenAccess.Read, OpenShare.LockReadWrite)
                  FileClose(F2)
                  My.Computer.FileSystem.DeleteFile(foundFile2)
              Next
          Catch ex As Exception
              EnvCode = 101
              WriteLine(ex.Message)
          End Try


спасибо.

3 Ответов

Рейтинг:
2

Member 10690594

1) Вы должны попытаться найти программу по умолчанию(исполняемый файл) этого файла:

Dim-ключ как Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.ClassesRoot
Dim secondKey как строка
Dim rtn как строка = ""

Если не ext.StartsWith ("."), то
доб = "." &ампер; внутр
Конец, Если

ключ = ключ.OpenSubKey(ext)

Если ключ-это не Ничто, то
secondKey = ключ.И getValue("").Метод toString()

Если secondKey < gt; "" То
ключ = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(secondKey & "ShellOpenCommand")
rtn = ключ.И getValue("").Метод toString()
РТН = система.Текст.RegularExpressions.Регулярное выражение.Матч(rtn, """(.*?)""").группы(0).значение
Конец, Если
Конец, Если

Вернуться Ростехнадзора
Конечная Функция

2) убейте процесс по умолчанию файла
3) продолжайте...


CHill60

Вы опоздали с этим ответом чуть больше чем на год

Рейтинг:
0

Zoltán Zörgő

Ну, это не так просто.
Чтобы файл можно было удалить, у него не должно быть открытых дескрипторов.
Вы можете либо завершить, либо убить процессы, удерживающие эти дескрипторы, либо закрыть сам дескриптор. Будьте осторожны, другой процесс не будет знать об этом. Вы можете разбить важные приложения - но это может быть лучше, чем убить его в любом случае. И все же это ваша забота :)

Итак, предполагая, что вы можете определить, какой файл заблокирован, у вас есть полное описание здесь, как собрать все дескрипторы, как отфильтровать дескрипторы файлов и найти файл, который вы ищете. Когда у вас есть ручка, вы можете закрыть ее.
Видеть: http://forum.sysinternals.com/howto-enumerate-handles_topic18892.html[^]

Это не так VB.NET. Вам, вероятно, понадобится много P/Invoke, так что это может быть полезно: NtQuerySystemInformation API работает на 32 битах, но не на 64 битах?[^]