2010-05-12 55 views
1

我在WCF設置項目中包含一個文本文件作爲輸出。 安裝項目(C:\ Program Files \ KLTesting \ KLTestApp)後,文本文件與dll,exe和config文件位於同一文件夾中。 但是當程序試圖讀取它時,它看起來在「C:\ Windows \ system32」下,找到&的正確方法是什麼?從安裝的WCF服務中的輸出文件中讀取

string a = Directory.GetCurrentDirectory(); 
a += "/R0303.txt"; 
string content = File.ReadAllText(a); 

感謝。

回答

1

您應該使用AppDomain.CurrentDomain.BaseDirectory或​​3210來獲取您的.exe文件的目錄。

+0

工作很好,不知道爲什麼有人會爲此付出代價。 – 2017-09-21 12:52:38

0

首先,您不應該調用Directory.GetCurrentDirectory()並將其與文件名連接起來。該服務在像IIS或其他類型的容器一樣的Web服務器中運行,因此GetCurrentDirectory不會在您發現時給您提供的內容。 (在快速切線中,如果您想要進行路徑組合,您應該使用Path.Combine方法,因爲它可以處理所有的角落案例並且是跨平臺的。)

有幾種方法這樣做:

Assembly myAssembly = Assembly.GetAssembly(SomeTypeInAssm.GetType()); 
string fullFileName = Path.Combine(myAssembly.Location, "MyFile.txt"); 

fullFileName應該是你在找什麼。確保使用實際位於程序集中的類型,並從相關目錄中引用該類型。但請注意,因爲在Program Files區域中的這個文件是在Vista和更高版本的操作系統上的安全區域,您可能無法訪問除了讀取文件以外的任何內容。

此外,您可以讓應用程序的安裝程序在註冊表中放置安裝路徑。那麼你的服務,如果在同一個盒子可以拉這個信息。

此外,您可以確保您要加載的文件位於可訪問有問題的WCF服務的Web服務器環境中。

+0

如果你想要組裝當前正在執行的代碼,你可以使用Assembly.GetExecutingAssembly() – 2010-05-12 01:02:20

+1

而順便說一下,WCF並不僅限於在asp.net應用程序中託管。普通的桌面應用程序或Windows服務也可以託管WCF端點。 – 2010-05-12 01:05:25

+0

@BurningIce我知道WCF並不侷限於在一個ASP.net應用程序中託管,我也沒有說過BTW,我在Web服務器上說WCF服務不必與ASP.net兼容。無論他如何聲明GetCurrentDirectory返回System 32,這意味着服務是他的入口點,並在他想要的位置引用該DLL。如果他想找到那個位置,他需要使用Reflection來獲得大會的位置。獲取AppDomain BaseDirectory很可能仍會返回System 32,在這種情況下,GetExecutingAssembly也是如此。 – 2010-05-12 16:06:30