2012年6月29日 星期五

[C#]OpenFileDialog在XP會更改working directory

今天碰到一個奇怪的bug。我寫了一個C#的tool用來parsing一些binary的檔案,此程式運作流程如下:

1. 用OpenFileDialog讓使用者選取parsing的binary檔案
2. 程式讀取一個parsing過程會用到的參數設定檔(放在和執行檔同一個目錄下)
3. parsing binary並且把結果寫到一個新的檔案

看起來很正常的流程,在第二步讀取設定檔時卻會一直回傳找不到檔案的錯誤訊息。而且很奇怪的是這段程式在Win7上可以執行,在XP上卻不能執行。找了很久才發現在XP上執行OpenFileDialog會更改working directory,造成我用相對路徑開檔時會找不到設定檔。而Win7的working directory在執行OpenFileDialog並不會被更改。

以下是一個簡單的範例程式可以看出working directory在執行OpenFileDialog後會被改掉:
 var dlg = new Microsoft.Win32.OpenFileDialog();
 workingDirectory = Directory.GetCurrentDirectory(); // Correct
 if (open.ShowDialog() == DialogResult.OK) {
        workingDirectory = Directory.GetCurrentDirectory(); // Wrong!!
 }
上面例子執行後會發現workingDirectory最後會被設定成OpenFileDialog選取檔案的那個資料夾。
還好網路上蠻多人碰到這個問題,解決方法很簡單,只要把RestoreDirectory設成true就可以了,這個Property在WPF以及Windows Form的FileDialog中都有實做:
 var dlg = new Microsoft.Win32.OpenFileDialog();
 dlg.RestoreDirectory = true;
 workingDirectory = Directory.GetCurrentDirectory(); 
 if (open.ShowDialog() == DialogResult.OK) {
        workingDirectory = Directory.GetCurrentDirectory(); 
 }
執行後可以發現執行完OpenFileDialog後working directory不會被改掉了。至於為什麽Win7的working directory不會被改掉,推測是因為Win7的RestoreDirectory預設就是true,而XP預設為false。(此推測是錯誤的,原因是因為系統底層的差異)

沒有留言:

張貼留言