2014-01-09 34 views
1

我都存儲在一個文件夾中的一些圖像的相對路徑:如何使用的,而不是絕對路徑

C:\MyPrograms\VisualStudio\BirdPrograms\BirdTouchScreenBasic\BirdTouchScreenBasic\pigeonImages

我打算使用一個不同的計算機上運行此程序,我創建的程序, 。

我有圖像的在List<Image>

陣列有一種方法以從相對路徑,而不是絕對路徑加載圖像?

即。而不是

Image.FromFile("C:/MyPrograms/VisualStudio/BirdPrograms/BirdTouchScreenBasic/BirdTouchScreenBasic/pigeonImages/pigeon5.png"); 

我可以只寫:

Image.FromFile("./pigeonImages/pigeon5.png"); 

我錯在假設Visual Basic使用用於運行程序的文件是在頂層文件夾與文件夾pigeonImages一個文件夾下。因此,在命令行上

我應該能夠類型:基於

C:\BirdTouchScreenBasic> cd pigeonImages

+0

你試過了你的假設嗎?因爲它是正確的... –

+0

「我錯了假設」 - 是的,很容易驗證... –

+0

這是WPF/WinForms? –

回答

1

對您提供的路徑,如果當前工作目錄是BirdTouchScreenBasic然後@".\pigeonImages\pigeon5.png"將是一個正確的路徑。如果您希望無論程序在哪裏運行,都可以訪問這些圖像,您應該將它們添加到您的解決方案中,並將它們複製到輸出目錄中。如果是這種情況,那麼你可以在整個代碼中使用相對路徑而沒有問題。如果你製作路徑@".\pigeonImages\fileName.ext",但實際上並沒有構建你的項目,那麼你的項目中的文件夾和文件就存在於CWD中,那麼你將遇到問題。

如果您不知道如何添加圖片,那麼您的C#項目中的資源是基本步驟;右鍵單擊proj文件並選擇添加新文件夾,創建pigeonImages文件夾。右鍵單擊該文件夾,然後選擇添加新項目。導航到要添加的圖像文件並選擇它,然後按確定。右鍵單擊剛剛添加的圖像,選擇屬性。有一個名爲「複製到輸出目錄」的選項,將其設置爲如果更新或複製始終複製。

+0

這就是我正在尋找。我工作得很好。我有一個文件夾中的圖像,但我沒有將該屬性設置爲「始終複製」。 – smokeAndMirrors

1

從來沒有這樣做,你的Environment.CurrentDirectory將被設置爲什麼是完全不可預知的。它不在你的控制之下,無論你的程序如何控制它。這經常出錯。

相反,您應該創建一個基於EXE位置的絕對路徑。假設您將圖像文件部署在與EXE相同的目錄或子目錄中。使用這樣的代碼,爲清晰起見拼寫出來:

using System.Reflection; 
using System.IO; 
... 
    public static Image LoadPigeon(string name) { 
     var exeDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 
     var imgDir = Path.Combine(exeDir, "pigeonImages"); 
     var imgPath = Path.Combine(imgDir, name); 
     return Image.FromFile(imgPath); 
    } 
+0

AppDomain.CurrentDomain.BaseDirectory可能比Assembly.GetEntryAssembly()更好。在一般情況下的位置如下所述:http://stackoverflow.com/a/6041505/13087。 GetEntryAssembly()在某些情況下可以返回null(確實不在WinForms應用程序中 - 這是OP的情況)。 – Joe

相關問題