Запись скомпилированного 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 - единственное место, где я видел это, но так много в деталях… за исключением того, что изображения и большинство дискуссия, похоже, исчезла в какой-то момент.