2013-12-20 110 views
1

我寫了一個程序,它創建了幾個sqlite3數據庫臨時文件。在開發中,我只是將它們存儲在與src包相同的文件夾中的一個文件夾中。我忽略了這樣一個事實,即當代碼編譯並從Program Files運行時,您需要管理員權限。 (我知道Program Files中的臨時文件也是不好的做法)編譯Python寫入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複製文件夾,他們可以。它們也對探險家可見。

有沒有其他人經歷過這個或知道發生了什麼?

+0

'C:\ Program Files(x86)\ ProgramName \ temp \ filename.db'是一個有效的Linux文件名。我不記得Windows能否真正「看到」這些文件,但是你能否確認不只有一個名爲'C:\ Program Files(x86)\ ProgramName \ temp \ filename.db'的本地文件? – Blender

+1

IIRC,Windows實際上把你的文件放在其他一些我不記得的地方,如果一個程序試圖寫入程序文件的安裝目錄,它們假裝它們進入Program Files。我遇到過一次類似的問題。不幸的是,這是關於我的知識程度。 – user2357112

+0

你用來創建文件的代碼是什麼? – MattDMo

回答

3

你是對的,你不應該寫入你的Program Files目錄。真的,這就是你的程序的解決方案:改變你的腳本停止這樣做。

但是,如果你想知道你的文件去,當你嘗試寫入Program Files文件(在Vista或更高版本,與UAC沒有被禁用):

  • 如果你正在以管理員身份運行,而不是XP/2003或更早版本的仿真,這些文件會直接寫入指定的路徑。
  • 如果您的應用程序符合神奇的觸發器看起來像一個安裝程序(Vista文檔見here),文件會直接寫入指定的路徑。
  • 如果您的應用程序位於Microsoft的兼容性數據庫中,則路徑將通過兼容性數據庫中的條目映射(似乎沒有任何文檔記錄)。
  • 否則,你的路徑是通過UAC文件虛擬化,這意味着嘗試寫保護目錄,如Program Files結束了根據用戶的應用數據目錄到你的程序的地方通過,看起來像程序文件,但是,說,資源管理器或cmd.exe它不。

我相信位置不保,也沒有記錄在案,並在一個點上它從應用程序的應用程序數據目錄爲用戶提供不同的特殊應用程序的數據目錄下的移動用戶到每個應用目錄,但在至少一個Windows 7的機器上是這樣的:

C:\用戶\ horriblyUnpythonic \應用程序數據\本地\ VirtualStore \程序文件(x86)\ ProgramName中\ TEMP \文件名。DB


有很多博客文章,如果你搜索「UAC文件虛擬化」在那裏。它們大多是從構建自定義安裝程序的角度編寫的,例如this one(因爲,您可以想象,這對於自定義安裝程序來說是一個嚴重問題),但它們大多都是將想法貫穿始終,並提供大量細節並添加鏈接以供進一步閱讀。

如果你只有經歷過這個問題,從遷移到Vista的7,或從32位Vista的64位Vista,this Microsoft blog是我見過的唯一的地方得到了遙遠的細節......除了圖像和大部分討論似乎都在某個時候消失了。

相關問題