2008-10-01 13 views
2

我有一個C#應用程序,包括下面的代碼:什麼會導致正在執行的應用程序的當前目錄改變?

string file = "relativePath.txt"; 

//Time elapses... 

string contents = File.ReadAllText(file); 

這工作得很好,大部分時間。該文件是相對於該應用程序從其開始的目錄中讀取的。但是,在測試中發現,如果單獨放置大約5個小時,該應用程序將拋出一個FileNotFoundException,表示無法找到「C:\ Documents and Settings \ Adminstrator \ relativePath.txt」。如果讀取文件的操作立即運行,則從正確的位置讀取文件,我們將其稱爲「C:\ foo \ relativePath.txt」

什麼給出了?而且,最好的解決方案是什麼?解決文件對Assembly.GetEntryAssembly().Location

+0

該應用程序的啓動目錄被加載爲當前工作目錄。這是完全可以改變的,如果一個不起眼的代碼部分做到這一點,那麼你最終會說上述行爲。將相對路徑轉換爲絕對路徑。 – workmad3 2008-10-01 15:34:21

回答

5

如果文件總是位於相對於可執行程序集的路徑中,那麼是的,請使用Assembly.Location。我主要使用Assembly.GetExecutingAssembly(如果適用),而不是Assembly.GetEntryAssembly。這意味着如果您正在從DLL訪問文件,則路徑將與DLL路徑有關。

+0

我最初使用GetExecutingAssembly,但正如我想到的,我希望這是相對於可執行文件的路徑,因爲它在該可執行文件的配置文件中,路徑將被定義。我也只能解決它,如果路徑不是絕對開始... – 2008-10-01 15:34:11

+0

你可以使用Path.Combine(Assembly [whatever] .Location,relativePath)。如果relativePath是絕對路徑,則Path.Combine將返回該絕對路徑並丟棄第一個參數。 – OregonGhost 2008-10-01 15:37:09

2

我覺得這個課應該不要依賴相對路徑,它們很容易出錯。當前目錄可以通過運行過程中的任意數量的東西來改變,比如文件對話框(雖然有一個屬性可以防止它們改變它),所以你永遠不能確保相對路徑在任何時候都會引導,除非你使用相對路徑從Application.StartupPath等已知路徑生成固定的路徑(但要注意從Visual Studio啓動時)或其他已知路徑。

使用相對路徑會使您的代碼難以維護,因爲項目中完全不相關的部分的更改可能導致另一部分失敗。

7

可以改變你的路徑的一個幽靈般的地方是OpenFileDialog。當用戶在文件夾之間導航時,它會將您的應用程序目錄更改爲當前正在查看的目錄。如果用戶關閉了另一個目錄中的對話框,那麼你將被卡在該目錄中。

它有一個名爲RestoreDirectory的屬性,它導致對話框重置路徑。但我相信默認值是「false」。

0

如果您使用openfiledialog和記住路徑屬性(不確定確切的名稱)是否爲true,那麼它會更改我認爲的當前目錄。

1

在System.Environment中,您有SpecialFolder枚舉,這將幫助您獲得標準相對路徑。

這種方式至少可以在內部獲得並傳回給您,所以希望如果系統以某種方式更改路徑,代碼將會處理它。

1

如果你服用點像

> CD C:\文件夾1

C:\文件夾1> 2 ../folder/theApplication.exe

應用程序了當前的工作目錄將c:\ folder 1。

下面是一個例子程序

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace CWD { 
    class Program { 
     static void Main (string[] args) { 
      Console.WriteLine(Application.StartupPath); 
     } 
    } 
} 

中構建此在的VisualStudio然後打開在調試/ bin目錄命令提示符並做

倉/調試> CWD.exe

然後執行

bin/debug> cd ../../ > bin/debug/CWD.exe

你會看到啓動路徑的不同。

關於原來的問題... 一旦應用程序運行時,只有移動或與預期刪除該文件,「如果一個人留在約5小時,應用程序將拋出一個FileNotFoundException異常」

位置應該會導致這個錯誤。

greg

相關問題