1

いくつかの sqlite3 データベース一時ファイルを作成するプログラムを作成しました。開発中は、src パッケージと同じフォルダー内のフォルダーにそれらを格納しました。コードをコンパイルして Program Files から実行するときに管理者アクセスが必要であるという事実を見落としていました。(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')

私のプログラムでは、ファイルが存在することを示していますが、エクスプローラー、cmd、またはアイドル状態には存在しません。ただし、cygwin には表示されます

隠しファイル/フォルダーを表示しましたが、表示されません。

エクスプローラーを使用して一時フォルダーをコピーすると、ファイルはタグ付けされません。cygwin を使用してフォルダーをコピーすると、コピーされます。エクスプローラーにも表示されます。

他の誰かがこれを経験したことがありますか、または何が起こっているのか知っていますか?

4

1 に答える 1

3

Program Files ディレクトリに書き込むべきではないというのは正しいことです。実際、それがプログラムの解決策です。スクリプトを変更して、それをやめる必要があります。

ただし、Program Files に書き込もうとしたときに、ファイルの行方を知りたい場合 (Vista 以降で、UAC が無効になっている場合):

  • XP/2003 以前のエミュレーションではなく、管理者として実行している場合、ファイルは指定されたパスに直接書き込まれます。
  • アプリがインストーラー プログラムのように見える魔法のトリガーに適合する場合 ( Vista のドキュメントについては、こちらを参照)、ファイルは指定されたパスに直接書き込まれます。
  • アプリが Microsoft の互換性データベースにある場合、パスは互換性データベースの全体を通してマップされます (どこにも文書化されていないようです)。
  • それ以外の場合、パスは UAC ファイル仮想化を介して渡されます。つまり、保護されたディレクトリへの書き込みの試みはProgram Files、ユーザーのアプリ データ ディレクトリの下のどこかに行き着きます。プログラムにとっては、Program Files のように見えますが、Explorer や cmd.exe などです。そうではありません。

場所は保証も文書化もされていないと思います。ある時点で、ユーザー用のアプリのアプリ データ ディレクトリから、ユーザー用の別の特別なアプリ データ ディレクトリの下のアプリごとのディレクトリに移動しましたが、少なくとも 1 台の Windows 7 マシン上でそれはこれです:

C:\Users\horriblyUnpythonic\AppData\Local\VirtualStore\Program Files (x86)\ProgramName\temp\filename.db


「UAC ファイル仮想化」で検索すると、たくさんのブログ投稿があります。それらのほとんどは、このようなカスタム インストーラーを構築するという観点から書かれています (ご想像のとおり、これはカスタム インストーラーにとって深刻な問題です)。詳細を確認し、さらに読むためのリンクを追加します。

Vista から 7 への移行、または 32 ビット Vista から 64 ビット Vista への移行でのみこの問題が発生した場合、この Microsoft ブログは、私が見た唯一の場所であり、詳細を詳しく説明しています。ただし、画像とほとんどの議論はある時点で消えたようです。

于 2013-12-21T00:23:11.040 に答える