2012-10-17 64 views
11

使用相對路徑檢查文件是否存在的最佳方法是什麼?使用相對路徑檢查文件的存在

我已經使用了下面的方法,但它返回false,儘管文件是存在的事實。

bool a = File.Exists("/images/Customswipe_a.png"); 
+0

相對於執行路徑?另外,如果這不是網絡,爲什麼你使用'/'insteaed''' –

+0

你有沒有偶然錯過「asp.net」標記,需要Server.MapPath呢? –

回答

10

這不是相對路徑。您需要先離開第一個/,否則它將被解釋爲根(即C:/圖像...)

+7

從技術上講,它只是相對於當前的驅動而言。 –

+0

@AlexeiLevenkov也許從技術上來說,是的。但是,爲什麼要區分絕對路徑和相對路徑,如果它們都是相對於某些東西的呢? – climbage

+0

我的定義是「如果路徑是指同一個文件,而不考慮環境配置」(它也不同於'Path.IsPathRooted',這是查看它的另一種方式)。我很難根據當前路徑調用路徑「\ p \ f.txt」,因爲它可以引用「c:\ p \ f.txt」或「d:\ p \ f.txt」...「c :\ path \ file.txt「或」\\ server \ path \ file.txt「對我來說更絕對。 –

0

該路徑相對於您的二進制文件的位置。在視覺工作室項目的情況下,這將是%PROJECTDIR%/bin/(RELEASE||DEBUG)/

我會做的是把文件系統根放在一個配置文件中,並將其用於相對路徑。

3

相對路徑相對於當前工作目錄。它可能不是應用程序目錄。致電GetCurrentDirectory()檢查您正在測試的實際路徑。

1

相對路徑,是一個相對東西。 在該API,它會,根據文檔File.Exists

相對路徑信息被解釋爲相對於當前 工作目錄。

因此,這裏一切都取決於什麼是這個查詢的執行時刻CurrentDirectoty

另外,你的路徑是無效的桌面路徑(我假設你從一些網頁文件或知識中選擇它)。要了解指定的路徑是否包含無效字符,請使用GetInvalidCharacters函數。

在您的具體情況下,使用@"\images\Customswipe_a.png"就足夠了。

+0

它對.Net APIs有效,不常用「/」而不是「\」,但是有效。並且'Path.GetInvalidPathChars()。Contains('/')'不會將「/」報告爲無效... –

+0

@AlexeiLevenkov:我不會說.NET API,我會說像桌面應用程序路徑。 – Tigran

5

我想你是在asp.net應用程序中運行此代碼,這就是爲什麼你會得到錯誤。

在asp.net中,您應該使用Server.MapPath("/images/Customswipe_a.png")來獲取「正確」路徑(相對於Web應用程序根目錄)。否則,您將獲得webserver可執行文件的本地路徑(IIS/WEBDAV/..任何其他名稱)。

0

在WinForms應用程序,你可以得到的exe文件的目錄與

string directory = 
    Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath); 

另一種解決方案使用反射

string directory = 
    Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 
2

你只需要定義你的文件是相對於

  • 您的應用程序主要程序集?
  • 當前目錄?
  • 應用程序數據目錄?
  • 將其命名爲...

在每一種情況下我建議你通過Path.Combine方法把它轉換成一個絕對路徑:

public static readonly string AppRoot = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 

... 

//calling with a '/' heading makes the path absolute so I removed it 
var fullPath = Path.Combine(AppRoot, "images/Customswipe_a.png"); 
var exists = File.Exists(fullPath); 

這樣就可以保證你在哪裏尋找。即使打開/保存文件對話框也可能會改變你的當前目錄。因此,調用File.Exists而沒有完整路徑通常是一個錯誤的決定。