2011-10-07 30 views
0

我的程序在Windows 7/Vista和我測試過的大多數Windows XP上運行良好。我在程序本身下打開一個1目錄的文件。它是Administration \ adm.txt(這正是我使用的相對目錄)。我爲我的項目使用.NET 2.0。 我試圖在舊的Windows XP(已安裝.NET 2.0)上運行我的程序,並且遇到了我生命中曾經見過的最奇怪的錯誤。該程序運行良好,直到用戶打開一個打開的文件對話框。之後,程序開始認爲它位於最後打開的文件對話框所在的目錄中。因此,如果打開的文件對話框上次瀏覽了C:\ My Documents \,並且嘗試打開Administration \ adm.txt文件,則會出現「C:\ My Documents \ Administration \ adm.txt」不存在的異常。不幸的是,我不能再使用那臺電腦,但我真的很想知道這是怎麼發生的。有人有任何想法嗎?Windows XP下的程序路徑(C#程序)

回答

2

Windows中的標準行爲是用於文件對話框來更改應用程序的當前目錄。您可以使用OFN_NOCHANGEDIR標誌阻止該標誌用於配置opensave對話框的OPENFILENAME structure

對於這個故事,看到舊的新博客:

http://blogs.msdn.com/b/oldnewthing/archive/2010/11/12/10089878.aspx

+0

非常感謝您的幫助!但是 - 爲什麼這隻發生在Windows XP版本下呢? – ThatGuy

+0

@ThatGuy:OPENFILENAME鏈接的第一段給出了一個線索(我猜這裏有點IMO)。在Vista下,舊的對話功能被替換爲可能不會設置當前目錄的新功能。 .Net可能會檢查Vista或更高版本並使用新版本。我不能確認,因爲我只在XP上。 – tinman

+0

謝謝。我使用的是C#,我一直只使用託管代碼。有沒有辦法讓我仍然可以更改OpenFileDialog的屬性,以便它在最後恢復正常? – ThatGuy

0

除了鐵皮人的答覆,我會補充說,這不是一個好主意,使用目錄是相對於當前目錄,因爲其他進程(包括你自己所見過的)可以改變當前目錄。以下代碼是在程序目錄下的目錄中創建文件名的更可靠方法:

string exeDirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 
string fileName = System.IO.Path.Combine(exeDirectory, System.IO.Path.Combine("Administration", "adm.txt")); 
+0

謝謝你的回覆!這樣更安全,但這需要我瀏覽我所有的文件引用,並且它們非常多(除了我所述的內容之外)。而且我的項目變得非常龐大,我需要花很多時間來重寫所有使用任何IO的地方。 我只假設沒有其他外部進程會改變當前目錄。 – ThatGuy