Я хочу иметь защищенную папку (папки) программы VB.NET, которая содержит несколько разных файлов, поэтому файлы внутри нельзя редактировать, если только программа не «разблокирует» папку в Windows. Это возможно? Я не хочу, чтобы папка/файлы были скрыты просто по существу в каком-то состоянии «Только для чтения» или что-то в этом роде или подделывали окна, думая, что они уже открыты. Цель состоит в том, что если кто-то открывает файлы без «разблокировки» программы, они не могут редактировать/сохранять изменения.
Является ли «разблокировка» путешествием в один конец или папка должна снова стать заблокированной? Что должно произойти с программой, у которой есть открытые дескрипторы для защищенных файлов, когда папка снова становится заблокированной? Очень сомнительно, что вы сможете сделать это, используя чистый .NET - существующие решения для «безопасной папки» устанавливают драйверы режима ядра для перехвата доступа. Однако, если вы можете оставить существующие дескрипторы открытыми, вы можете что-то сделать, отредактировав ACL.
Мое приложение не открывает/использует папки или файлы, оно просто управляет ими. Я хочу иметь возможность открывать свою программу, выбирать папку и «запирать» ее, а также «разблокировать». Но мне нужно, чтобы файлы оставались «заблокированными» только для чтения или в таком состоянии даже после закрытия приложения. Затем можно было бы использовать приложение для изменения состояния, если это необходимо. Но я не хочу, чтобы файлы были скрыты. Мне все еще нужна прозрачность того, что они существуют.
Объем проекта заключается в блокировке файлов для управления версиями, например, в программе «Vault», но количество файлов, которыми мы хотим управлять, невелико по сравнению со стоимостью такой программы, которая может входить в файл и выходить из него. Я не пытаюсь «заблокировать» файл в том смысле, что он нечитаем или скрыт; просто чтобы люди не могли вносить изменения. Мне очень нужны файлы в целости и сохранности.
Возможно, эта статья будет вам полезна:
Лучшим решением для достижения этой функциональности является создание драйвера файловой системы Kernel Minifilter, который не позволяет другим приложениям записывать или даже читать файлы, указанные вашей программой, однако разработка драйвера требует обширных знаний о ядре системы.
Основные понятия диспетчера фильтров
https://learn.microsoft.com/en-us/windows-hardware/drivers/ifs/filter-manager-concepts
Обработка операций ввода/вывода
https://learn.microsoft.com/en-us/windows-hardware/drivers/ifs/processing-i-o-operations
Связь между режимом пользователя и режимом ядра
Написание подпрограмм обратного вызова перед операцией
Завершение операции ввода-вывода в подпрограмме обратного вызова перед операцией
К моему удивлению, простое создание файла/папки с атрибутом «Только для чтения» решает мою проблему именно так, как я хотел. Пример кода для создания файла или папки только для чтения приведен ниже:
Dim LockFolder As New ProcessStartInfo("cmd", "/c ATTRIB +R " + """" + Application.StartupPath() + "\" + SelectedNodeText + """\* /S /D") _
With {.WindowStyle = ProcessWindowStyle.Hidden, .Verb = "runas"}
Process.Start(LockFolder)
'===== FILE LOCK:
Dim LockFile As New ProcessStartInfo("cmd", "/c ATTRIB +R " + """" + Application.StartupPath() + "\" + SelectedNodeText + """") _
With {.WindowStyle = ProcessWindowStyle.Hidden, .Verb = "runas"}
Process.Start(LockFile)
Application.StartupPath
— это первая половина моего пути, а SelectedNodeText
— фактическое имя файла, которое завершает команду CMD. Остальное - просто заставить команду работать от имени администратора и не иметь всплывающего командного окна.
Происходит ли редактирование в вашем приложении? Или ваше приложение запускает связанное приложение? Например. запустить Excel для файлов *,xlsx в папке.