2012-02-01 74 views
0

我有一個bizzare問題,編寫了一個程序,其中命令File.Exists()並不總是檢測與可執行文件相同的目錄中的同一個文件。File.Exists檢測問題

我有類似的財產以後:

if (File.Exists("TextFile1.txt")) 
     { 
     //do some stuff 
     } 

,但奇怪的是,如果我運行這個可執行文件在命令提示符它不檢測該文件。但如果我通過另一個進程啓動這個可執行文件,它會檢測到File Fine。

關於這個bizzare問題的任何想法? 謝謝。

+2

爲什麼你不能完全限定路徑? – Yuck 2012-02-01 16:14:04

+1

與執行有關的文件在哪裏?另一個過程呢? – cadrell0 2012-02-01 16:14:37

+1

我想這一切都取決於應用程序認爲當前工作文件夾是什麼...... – 2012-02-01 16:15:06

回答

1

由於您使用的是相對路徑,我有一個預感,執行程序集的位置不是您認爲的那樣。

在您的代碼嘗試檢查其中的EXE是從推出:

System.IO.Path.GetDirectoryName( 
    System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); 

(從http://msdn.microsoft.com/en-us/library/aa457089.aspx

13

這是可執行文件工作目錄的相對路徑。從命令提示符運行應用程序時,工作目錄將設置爲可執行文件所在的目錄。當您通過另一個進程(Process.Start)運行此可執行文件時,工作目錄是主機進程的工作目錄。您可以在運行流程之前修改工作目錄,也可以使用絕對文件路徑。

要記住的另一件事是,File.Exists可能會返回false,如果您正在運行您的代碼的帳戶沒有足夠的權限文件夾。

如果調用者具有所需權限並且路徑包含 現有文件的名稱,則爲true;否則,是錯誤的。如果路徑爲空,無效路徑或零長度字符串,則此方法還返回 。如果 調用者沒有足夠的權限來讀取指定的 文件,則不會拋出異常並且該方法返回false,無論 是否存在路徑。

+3

不一定,工作目錄可以另外設置。 – 2012-02-01 16:15:06

+0

如果用戶沒有將目錄更改爲可執行文件所在的位置,那麼用戶可能會使用路徑運行可執行文件,然後他會得到他描述的問題。另外,** OP應該使用** Application.ExecutablePath **作爲引用路徑的常量**。 – 2012-02-01 16:16:41

+0

要讀取的文件與可執行文件位於同一目錄中,但是當我從另一個進程(例如進程管理器)啓動可執行文件時,它將起作用。在cmd提示符下自行啓動可執行文件,但沒有檢測到它。 – Gelion 2012-02-01 16:17:12

3

文件路徑相對於CurrentDirectory而不是可執行文件所在的位置。您應完全限定文件路徑,或獲取可執行文件的位置。

1

MSDN

路徑參數被允許指定相對或絕對路徑 信息。相對路徑信息被解釋爲相對於當前工作目錄的 。要獲取當前工作的 目錄,請參閱GetCurrentDirectory。

而當你看GetCurrentDirectory

當前目錄是從原來的目錄,這是 從進程啓動的一個區別。

0

問題是最有可能的是,CurrentDirectory進程之間變化。

但是,另一個問題可能是每個進程作爲不同的用戶/權限運行,並且命令提示符無權訪問文件所在的文件夾。