2010-03-07 65 views
4

我被徹底糊塗了這裏的鄉親,File.Exists()返回false,但不是在調試

我的代碼拋出一個異常,因爲File.Exists()返回false

public override sealed TCargo ReadFile(string fileName) 
{ 
    if (!File.Exists(fileName)) 
    { 
     throw new ArgumentException("Provided file name does not exist", "fileName"); 
    } 

的Visual Studio在throw語句中打破,我立即在即時窗口中檢查File.Exists(fileName)的值。它返回true。當我將斷點拖回到if語句並再次執行時,它會再次拋出。

fileName是文件的絕對路徑。我沒有創建該文件,也沒有寫入(它一直存在)。如果我在記事本中將路徑粘貼到打開的對話框中,它會毫無問題地讀取文件。

代碼在後臺工作中執行。這是我能想到的唯一複雜因素。我肯定該文件尚未打開,無論是在工作線程還是其他地方。

這是怎麼回事?

+2

什麼是路徑? – SLaks 2010-03-07 19:19:37

+0

只是'文件。存在(fileName)'部分返回true或整個'!File.Exists(fileName)'語句返回true? – animuson 2010-03-07 19:20:00

+0

如果你在沒有後臺工作進程的情況下運行它 - 假設它與你所說的文件沒有關係,它的行爲如何? – 2010-03-07 19:21:51

回答

12

我不知道發生了什麼,但爲什麼你需要File.Exists測試呢?你真正感興趣的是,「我可以閱讀這個文件?」除File Not Found以外的其他許多事情可能會出錯。

更不用說,執行File.Exists測試是一種競爭條件,因爲文件在完成測試後可能會消失,但在打開文件之前可能會消失。只需打開文件,這是您可以執行的最佳測試,以確定您是否可以讀取該文件。

+2

+1 ,那是唯一正確的方法。 File.Exists主要用於鎖定文件等情況,您只需要監視另一個進程來創建或刪除文件,而實際上並不打算打開它。 – 2010-03-07 19:25:11

+0

保羅,我想你有一個觀點。我會測試它。 – 2010-03-07 19:31:23

+4

我不同意這個說法。檢查文件的存在是否謹慎*還會*嘗試打開不存在的文件來捕獲異常。與額外的檢查相比,異常可能代價高昂,並且使代碼看起來更清晰。 – Josh 2010-03-07 19:50:59

1

那麼,你的文件名是什麼路徑?記住當你建立調試並釋放你編譯到不同的文件夾。所以如果你把文件放到調試文件夾中,你在發佈版本時就不會找到它。

+1

該路徑與構建無關。它實際上是出於對Directory.GetFiles()的調用,所以絕對應該存在。 – 2010-03-07 19:32:57

6

如果您無權訪問所引用的文件夾或文件,File.Exists將返回false。這可能是因爲您可以以管理員身份在立即窗口中查看該文件,但在不同的上下文中運行時,您沒有權限。

+0

我的猜測也是。 VS可能以admin身份運行,這可能解釋了爲什麼該文件在調試器中可見。 – 2010-03-07 19:34:30

+0

確實如此,但如果您從提升的Visual Studio運行(無需調試),子進程也將被提升。 – Josh 2010-03-07 19:47:15

0

嗯,這種檢查後你在做什麼樣的事情?確保在清除文件狀態之前再次拖動斷點。

1

我也遇到過這個問題。問題是你正在函數中直接綁定路徑。相反,你應該寫server.mappath("yourfolder name where file resides"),然後將其與圖像連接起來。

1

嘗試在路徑中添加「.ToString()」。例如:

if (!File.Exists(fileName.ToString())) 
{ 
    throw new ArgumentException("Provided file name does not exist", "fileName"); 
} 

或者,如果將字符串連接,把它放在括號,然後」的ToString 「:

if (!File.Exists((filePath + "SomeRandomName").ToString())) 
{ 
    throw new ArgumentException("Provided file name does not exist", "fileName"); 
} 

(從問題)

我不安靜明白爲什麼」。 ToString()「需要放在那裏,但它似乎有幫助...

+1

我收回了它,它似乎有幫助...但它是一個虛假的希望 – RogueBudz 2012-08-28 13:45:33

+0

它確實爲我工作! 上調試它返回true,而在釋放它返回False 我試着添加filname.toString(),它的工作就像魅力! 最新點! – AbeerAhdab 2017-10-06 09:40:22

1

試着寫這樣︰

if (!Server.Map(fileName)) 
相關問題