2014-12-03 146 views
0

我的WPF應用程序中有一個文件夾 - Helpers/1.png。該文件夾包含圖像和xml文件。當我從Visual Studio運行我的程序時,它可以正常工作。然而,當我從另一個邏輯磁盤運行我的程序的「exe」文件,我已經看到了這樣的錯誤:找不到路徑的一部分。複製應用程序中的文件。 WPF

Could not find a part of the path ""..//..//Helpers//1.png" 

我想圖像(「1.png」)和XML filee被複制從運行應用程序並由用戶複製的可執行應用程序。

enter image description here

如何解決這個問題?

回答

3

您可以指定一個文件在您的項目通過文件的屬性會發生什麼:

enter image description here

Build ActionResourceCopy To Output DirectoryCopy always將意味着該文件被複制到輸出目錄解決方案作爲一個文件(即你可以在資源管理器中看到它)。

如果在應用程序中使用該文件,它必須以指定的絕對路徑或相對路徑出現在磁盤上。否則,你會得到你描述的錯誤。如果我正確理解你,你想創建一個自包含的可執行文件,無論它在哪裏複製都可以運行。這意味着您的應用程序不能依賴於任何外部文件。

要解決此問題,您需要將所有外部文件嵌入到可執行文件中,並更改代碼以使用這些嵌入文件,而不是期望磁盤上的文件。

這裏得到一個方法,你開始:

public static byte[] GetResourceAsByteArray(string filename) 
    { 
     var assembly = Assembly.GetCallingAssembly(); 
     using (var resFilestream = assembly.GetManifestResourceStream(filename)) 
     { 
      if (resFilestream == null) return null; 
      var ba = new byte[resFilestream.Length]; 
      resFilestream.Read(ba, 0, ba.Length); 
      return ba; 
     } 
    } 

要使用它,你需要在你的文件的生成操作設置爲Embedded Resource,並調用該方法與文件的全名,其中名稱被組裝這樣的:

[RootNameSpaceOfTheProject].[NameOfFolderInTheProject].[FileNameWithExtension]

實施例:

enter image description here

調用方法:

var b = ResourceOperations.GetResourceAsByteArray("Store.Resources.EmbeddedIcons.toolbox.png"); 

現在可以將字節數組寫入到例如一個臨時文件,並以此作爲圖像源,或者也可以直接建立從字節數組的圖像。至少,你有你的數據...

2

從另一個邏輯磁盤運行時,文件夾結構是什麼樣的?你確定這些文件存在嗎?他們是否確實位於可執行文件位置的兩個文件夾下?

例如,如果這是你的可執行文件:

x:\path\to\your\executable.exe 

是1.png其實就設在這裏?:

x:\path\Helpers\1.png 

如果文件不存在,請檢查* .png文件的屬性,在您的解決方案,以確保每個生成操作設置生成過程中的文件複製到複製輸出。

更新時間:

你不能用 「.... \」 路徑指定1.png的位置。你正在做的是告訴可執行文件使用VS項目中的1.png。當你編譯時,你的程序輸出到相對路徑bin($ Configuration)(bin \ Debug或bin \ Release)。所以當你執行一個調試會話時,你的應用程序正在關閉兩個目錄級別到VS項目文件並抓取1.png。但是,VS項目不在您部署的應用程序中。

你需要做兩件事情:

1) Change your program code to load "Helpers\1.png" instead of "..\..\Helpers\1.png" 

2) Highlight 1.png in VS Solution Explorer, right click, and select Properties. In the Properties pane change 'Build Action' to 'Copy Always' or 'Copy if Newer'. (Another response here provided an excellent guide with screenshots) 

這樣,你的構建過程將創建相對路徑「助手」和複製1.png它。因此,確保無論您在何處部署應用程序,路徑和文件都將存在。

爲了演示其差異,在進行這些更改之前,請導航到包含VS項目的文件夾,然後轉到路徑bin \ Debug。你會在這裏看到Helpers \ 1.png不存在。進行上面列出的兩個更改,重建,然後再看看bin \ Debug。你現在會看到bin \ Debug \ Helpers \ 1.png存在。

+0

請看到我更新的問題。 – StepUp 2014-12-03 13:37:33

+0

謝謝,我閱讀您的更新,並更新了我的答案。 – 2014-12-03 13:52:30

0

右鍵單擊文件或圖像任何東西,然後單擊屬性。 然後選擇生成操作內容,複製到將目錄輸出爲始終複製。

如果您正在構建使用安裝Sheild

選擇內容文件複選框,同時增加項目出來放文件的設置。

您需要根據設置進行編碼。

首先你聲明瞭三個字符串。

private string strCurrentFolder = "\\give the Project path\\bin\\Debug"; 
    private string strXMLFolder = "\\give the project folder path\\give folder name where the files stored"; 
    but the folder sholud be there in Project. 

    private string strXMLSetupFolder = "\\give folder name where the files stored"; 
    string XMLFilepath; 

    if (Application.StartupPath.Contains("Project Name")) 
      XMLFilePath = Application.StartupPath.Replace(strCurrentFolder, strXMLFolder); 
    --This is for Visual Studio run 

    else 
      XMLFilePath = Application.StartupPath + strXMLSetupFolder; 

    --this is for insatllation folder path 

終於,您將從XMLfilepath字符串中獲取文件夾路徑。

XMLFilepath \給出文件名;

0

當你在VS中調試你的程序時,它會運行一個不同的「工作目錄」。這意味着,GetCurrentDirectory可能不會返回程序實際所在的目錄 在其他的答案說明設置生成操作,然後使用此代碼來獲取該文件的路徑:

string epath = Assembly.GetExecutingAssembly().Location; // this is the full path to the program 
string filepath = epath.Substring(0, epath.LastIndexOf('\\') + 1) + "Helpers\\1.png"; // this is the full path to the file you need 
相關問題