2013-02-20 53 views
1

我有一個日誌對象,每日日誌文件寫入一個相對路徑。這很簡單(.NET 4.0,VS 2010)。相對路徑變化?

public void LogLine(string txt) 
{ 
    DateTime dt = DateTime.Now; 
    if (CurrentDay != dt.Day) 
    { 
     string newFileName = "..\\Log\\" + programName + dt.Day + ".log"; 
     fs = new FileStream(newFileName, FileMode.Create, FileAccess.Write); 
     sw = new StreamWriter(fs); 
     CurrentDay = dt.Day; 
    } 
    sw.WriteLine(txt); 
} 

這種運作良好,幾乎所有的時間。然而,有時我會得到一個完全不同的路徑,似乎是一個隨機的DirectoryNotFoundException。例如,當我第一次運行該程序,它會創建一個文件:

C:\ MYFILES \登錄\ MyApp19.log

使用一些程序,讓它在夜間運行這樣一個新的文件後,並流創建(在午夜後的第一個日誌),我回來了DirectoryNotFoundException說明是這樣的:

C:\ MYFILES \ MyOtherFiles \資源\登錄\ MyApp20.log

我唯一能想到的是:我在軟件的整個生命週期中使用了OpenFileDialog和SaveFileDialog幾次,其中一個打開/保存對話框訪問

C:\ MyFiles \ MyOtherFiles \資源\ SavedFiles \

所以,在我看來,當我使用的對話,我打開/保存的東西到SavedFiles目錄,當它創建新的日誌,相對文件路徑.. \上升到資源(從SavedFiles),然後找不到d目錄日誌資源並引發異常。但是,我不能使用對話框重現問題,並且我認爲相對路徑與可執行文件相關?打開/保存文件對話框可以改變軟件計算相對文件路徑的方式嗎?任何人有任何想法?謝謝你的時間!

+1

就以這個[問題]看看(http://stackoverflow.com/questions/930816/why-does-openfiledialog-change-my-工作目錄)。當你使用'OpenFileDialog'時,你的工作目錄被改變了。 – HuorSwords 2013-02-20 15:30:49

+1

@HuorSwords謝謝,我對「工作目錄」這個詞非常天真。有趣的是,如果我在對話框之前和之後打印Directory.GetCurrentDirectory(),兩個打印都是相同的。但是,這個問題肯定來自其中一個對話框。我確信恢復該目錄將起作用,但是令人煩惱的是無法重現我遇到的問題! – Softerware 2013-02-20 15:56:37

回答

3

Alng我認爲下面的鏈接可以幫助你:

http://msdn.microsoft.com/en-us/library/system.windows.forms.filedialog.aspx

,請注意以下部分:

重要提示: 如果您的應用程序的用戶更改文件夾FileDialog,那麼你的應用程序的當前工作目錄被設置爲在FileDialog中指定的位置。爲防止出現這種情況,請將RestoreDirectory屬性設置爲true。

嘗試使用Microsoft建議的路徑方法,如上述鏈接中所述。

這可以幫助你也 http://msdn.microsoft.com/en-us/library/system.windows.forms.application.executablepath.aspx

問候

2

相對路徑總是適用於應用程序的當前目錄。例如,當您顯示保存對話框時,這可以輕鬆更改。
創建相對於您的可執行文件的路徑總是更好。

var assembly = Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly(); 
var path = Path.GetDirectoryName(assembly.Location); 
newFileName = Path.Combine(path, "..\\Log\\" + programName + dt.Day + ".log"); 
1

我正在猜測該應用程序在某些時候改變當前的工作目錄。因此,在此基礎上,我會爲日誌文件使用完全限定的路徑。您可以使用程序集的啓動路徑,例如Application.StartupPath,即使應用程序出於某種原因更改文件夾,它也不應該更改。