Запись скомпилированного Python в программные файлы

Я написал программу, которая создает несколько временных файлов базы данных sqlite3. В процессе разработки я просто сохранил их в папке в одной папке с пакетом src. Я упустил из виду тот факт, что вам нужен доступ администратора, когда код компилируется и запускается из программных файлов. (Я знаю, что временные файлы в Program Files тоже плохая практика)

Проблема в том, что проблемы нет. Я не понимаю IOError: [Errno 13] Permission denied: или предупреждение любого рода. Кроме того, если я иду в папку, где должны быть временные файлы, там нет никаких.

Если я добавлю строку, как

print os.path.exists(r'C:\Program Files (x86)\ProgramName\temp\filename.db')

или же

print os.listdir(r'C:\Program Files (x86)\ProgramName\temp')

в моей программе это показывает, что файлы есть, но их нет в explorer, cmd или idle. Они , однако, появляются в Cygwin.

Я показал скрытые файлы / папки, и они не отображаются.

Если я скопирую временную папку с помощью проводника, файлы не будут добавлены. Если я копирую папку с помощью Cygwin, они делают. Они также становятся видимыми для исследователя.

Кто-нибудь еще испытывал это или знает, что происходит?

1 ответ

Решение

Вы правы, что вы не должны писать в каталог Program Files. И действительно, это решение вашей программы: измените сценарий, чтобы прекратить это делать.

Но если вы хотите знать, куда направляются ваши файлы, при попытке записи в Program Files (в Vista или более поздней версии с отключенным UAC):

  • Если вы работаете от имени администратора, а не с XP/2003 или более ранней эмуляцией, файлы записываются непосредственно по указанному пути.
  • Если ваше приложение соответствует волшебным триггерам и выглядит как программа установки (см. Здесь документацию по Vista), файлы записываются непосредственно по указанному пути.
  • Если ваше приложение находится в базе данных совместимости Microsoft, пути отображаются через все базы данных совместимости (которые нигде не документированы).
  • В противном случае ваши пути передаются через виртуализацию файлов UAC, что означает попытки записи в защищенные каталоги, такие как Program Files в конечном итоге где-то в каталоге данных приложения пользователя - для вашей программы это выглядит как Program Files, но, скажем, для Explorer или cmd.exe это не так.

Я считаю, что это местоположение не гарантировано и не задокументировано, и в какой-то момент оно было перемещено из каталога данных приложения для пользователя в каталог для приложения в другом каталоге данных специального приложения для пользователя, но, по крайней мере, на одном компьютере с Windows 7 это так:

C: \ Users \ horriblyUnpythonic \ AppData \ Local \ VirtualStore \ Program Files (x86) \ Имя_программы \temp\filename.db


Есть много постов в блоге, если вы ищете "виртуализация файлов UAC". Большинство из них написаны с точки зрения создания пользовательских установщиков, как этот (потому что, как вы можете себе представить, это серьезная проблема для пользовательского установщика), но в основном все они дают идеи и предоставляют множество подробности, и добавьте ссылки для дальнейшего чтения.

Если вы сталкивались только с этой проблемой при переходе с Vista на 7 или с 32-битной Vista на 64-битную Vista, этот блог Microsoft - единственное место, где я видел это, но так много в деталях… за исключением того, что изображения и большинство дискуссия, похоже, исчезла в какой-то момент.

Другие вопросы по тегам