2014-12-03 113 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 
相关问题