Я уже некоторое время изучаю способ предотвратить случайный вход моего пользователя в каталог данных моего приложения.
Мое приложение использует папку для хранения структурированного проекта. Внутренняя структура папок критична и не должна нарушаться. Я бы хотел, чтобы мой пользователь видел эту папку целиком и не мог ее открывать (как пакет Mac).
Есть ли способ сделать это в Windows?
Редактировать из текущих ответов
Конечно, я не пытаюсь помешать моим пользователям получить доступ к своим данным, а просто защищаю их от случайного нарушения целостности данных. Так что шифрование или защита паролем не нужны.
Спасибо всем за ответы .Net, но, к сожалению, это в основном проект на C++, не зависящий от инфраструктуры .Net.
Приведенные мной данные не являются световыми, это изображения, полученные с помощью электронного микроскопа. Эти данные могут быть огромными (от ~ 100 МиБ до ~ 1 ГиБ), поэтому загрузка всего в память не вариант. Это огромные изображения, поэтому хранилище должно обеспечивать способ чтения данных постепенно, обращаясь к одному файлу за раз, не загружая весь архив в память.
Кроме того, приложение в основном является устаревшим, с некоторыми компонентами, за которые мы даже не несем ответственности. Предпочтительно решение, которое позволяет мне сохранить текущий код ввода-вывода.
Shell Extension выглядит интересно, я буду исследовать решение дальше.
LarryF, не могли бы вы подробнее рассказать о драйвере фильтра или DefineDOSDevice? Я не знаком с этими концепциями.
Конечно обновил ответ





Внутри или вне вашей программы?
Есть способы, но ни один из них не прост. Вы, вероятно, будете искать драйвер фильтра в файловой системе.
Вы можете обернуть каталог своего проекта в файл .zip и хранить там свои данные, так же, как используется .jar (я знаю, что .jar в значительной степени доступен только для чтения, это для примера). Сделайте нестандартное расширение, чтобы двойной щелчок не имел немедленного эффекта, готово. ;-)
Конечно, это означает, что вам придется обернуть весь ввод-вывод файла, чтобы вместо этого использовать .zip, в зависимости от того, как построена ваша программа, это может быть утомительно. Это уже сделано для Java: TrueZip. Может быть, ты сможешь использовать это как вдохновение?
Если вас соблазнило - я бы не рекомендовал возиться с правами доступа к папкам, по понятным причинам это не поможет.
Вы можете сделать следующее:
Одна вещь заключается в том, что вы можете создать расширение оболочки Windows FolderView, которое будет создавать настраиваемое представление для вашей критически важной папки. Создав собственный FolderView, вы можете сделать папку просто пустой белой с одной строкой текста «Здесь нечего видеть», или вы можете сделать что-то более сложное, например, средство просмотра GAC, которое использует тот же метод. Этот метод был бы довольно сложным, но эту сложность можно уменьшить, используя в качестве основы что-то вроде библиотеки статей этот CodeProject.
Другое решение - создать ZIP Virtual Filesystem, для этого вам потребуется заменить любой код, который напрямую использует System.IO, чтобы использовать что-то еще. ASP.NET 2.0 сделал это именно по этой причине, и вы могли бы довольно легко построить поверх этого, взгляните на этот Статья MSDN при реализации VirtualPathProvider.
Похоже, это в основном для ASP.NET, но он ничего не упомянул об ASP или .NET ... Однако идеи хорошие.
Вы можете использовать изолированное хранилище.
http://www.ondotnet.com/pub/a/dotnet/2003/04/21/isolatedstorage.html
Это не решает всех проблем, но надежно защищает данные приложения.
Имейте в виду: если вы сохраните его в файловой системе, пользователь ВСЕГДА сможет его увидеть. Взломайте проводник, и вместо этого я использую cmd.exe. Или Total Commander. Или что-нибудь еще.
Если вы не хотите, чтобы люди возились с вашими файлами, я бы порекомендовал
Это, конечно, не полная защита, но она довольно проста в реализации, не требует установки каких-то забавных вещей внутри операционной системы и должна отпугнуть самых любопытных пользователей.
Конечно, вы никогда не сможете полностью контролировать файлы на компьютере пользователя, не управляя самим компьютером.
Я видел программное обеспечение (Agilian от Visual Paradigm), которое использовало предложение Томалака о zip-архиве в качестве «файла проекта». Zip-файлы хорошо изучены, а использование нестандартного расширения файла не позволяет случайному пользователю вмешиваться в «файл». Одним из больших преимуществ этого является то, что в случае повреждения можно использовать стандартные инструменты для решения проблемы, и вам не нужно беспокоиться о создании специальных инструментов для поддержки вашего основного приложения.
Если вы воспользуетесь подходом к ZIP-файлу (который я рассмотрел для вас, но не упомянул), я бы предложил использовать алгоритм deflate, но использовать вашу собственную файловую систему ... Посмотрите на что-то вроде формата TAR. Затем просто напишите свой код, чтобы пропускать ВСЕ операции ввода-вывода через алгоритмы Inflate / Deflate по мере их записи на диск. Я бы не стал использовать ZIP "FORMAT", так как слишком просто посмотреть файл, найти PK в первых двух байтах и разархивировать файл ....
Мне больше всего нравятся предложения Джошперри.
Конечно, вы также можете написать драйвер устройства, который хранит все ваши данные в одном файле, но, опять же, мы ищем драйвер. (Я не уверен, что вы могли бы реализовать это вне драйвера. Вы, ВЕРОЯТНО, можете, и внутри вашей программы вызовите DefineDOSDevice, дав ему имя, к которому имеет доступ только ваш код, и он будет рассматриваться как обычная файловая система. ). Я поиграю с некоторыми идеями, и если они сработают, я сниму вам образец. Теперь вы меня заинтересовали.
Похоже, начинают появляться какие-то Порты Windows FUSE. Я думаю, что это было бы лучшим решением, поскольку оно позволило бы мне сохранить устаревший код (который довольно велик) нетронутым.
Структурированное хранилище был разработан для описываемого вами сценария:
Structured Storage provides file and data persistence in COM by handling a single file as a structured collection of objects known as storages and streams.
«Хранилище» аналогично папке, а «поток» аналогичен файлу. По сути, у вас есть один файл, который при доступе с использованием API структурированного хранилища ведет себя и выглядит как полная автономная файловая система.
Однако обратите внимание, что:
A solid understanding of COM technologies is prerequisite to the developmental use of Structured Storage.
Это было бы отличной идеей, если бы у меня не было такого большого количества устаревшего кода. Я быстро взглянул на API, и похоже, что вам нужно использовать определенные COM-интерфейсы (IStream) для чтения содержимого «файлов» в вашем хранилище. Таким образом, с этим решением невозможно использовать существующий код.
Можете ли вы пролить свет на то, на каком языке / в какой среде вы находитесь?