Программа в папке Program Files не может создавать файлы в своем собственном каталоге

Программа в папке Program Files не может создавать файлы в своем собственном каталоге

Это мой первый раз, когда я задаю вопрос о superuser (хотя я часто ссылаюсь на stack-overflow и superuser), поэтому отнеситесь ко мне с пониманием, если я сделаю какие-либо ошибки или буду неясен в своем вопросе, и я исправлю любые ошибки или уточню по мере необходимости.

Я разработал приложение, скажем, MyApp, и создал установщик, который устанавливает основной исполняемый файл со связанными с ним зависимостями (папками и файлами) в его собственную выделенную папку в C:\Program Files (x86)\MyAppFolder\.

Проблема в том, что во время выполнения он должен создавать файлы, такие как журналы и т. д., в своем собственном каталоге, папке MyAppFolder. После некоторых раскопок я понял, что это потому, что он не запущен как администратор (мой пользователь — администратор, к вашему сведению) — или, скорее, потому, что только администраторы могут писать в \Program Files, я полагаю. Если я запускаю свое приложение как администратор, оно может записывать требуемые файлы и папки.

Но разве приложение не должно в идеале иметь возможность писать в своей собственной папке? Даже если оно не работает с правами администратора? Что я здесь упускаю?

Заранее спасибо.

решение1

В Windows нет такого понятия, как «собственная папка программы».

Существует концепция "текущей папки программы", которая по умолчанию является папкой, из которой она была запущена. Разрешения, которыми обладает программа, исходят из учетной записи пользователя, которая ее запустила, а не из того, где она находится.

Это означает, что когда программа запускается из Program Files, она по умолчанию запускается под вашей учетной записью, а не под учетной записью Администратора. Поэтому у нее нет разрешения на запись в папку, где она находится.

Для программы имело бы смысл записывать свои файлы в незащищенную папку. Обычное место — создать собственную папку внутри C:\Users\USERNAME\AppData\Local, также доступную в переменной окружения %LOCALAPPDATA%, но это может быть любое место по вашему выбору.

Связанный контент