找不到路径的一部分。从应用程序中复制文件。 WPF

时间:2014-12-03 13:03:00

标签: c# xml wpf image copy

我的WPF应用程序中有一个文件夹--Helpers / 1.png。此文件夹包含图像和xml文件。当我从Visual Studio运行我的程序时,它可以正常工作。但是,当我运行" exe"我的程序文件来自另一个逻辑磁盘,我看到了这样的错误:

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

我希望从用户运行和复制应用程序的可执行应用程序中复制图像(" 1.png")和xml文件。

enter image description here

如何解决此错误?

4 个答案:

答案 0 :(得分: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");

现在您可以将字节数组写入临时文件并将其用作图像源,或者您可以直接从字节数组构建图像。至少,你有你的数据......

答案 1 :(得分: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)

通过这种方式,您的构建过程将创建相对路径' Helpers'并将1.png复制到它。从而确保无论您在何处部署应用程序,路径和文件都将存在。

为了演示差异,在进行这些更改之前,导航到包含VS项目的文件夹,然后转到路径bin \ Debug。你会看到Helpers \ 1.png在这里不存在。进行上面概述的两个更改,重建,然后再看看bin \ Debug。您现在将看到bin \ Debug \ Helpers \ 1.png存在。

答案 2 :(得分:0)

右键单击文件或图像任何东西,然后单击属性。 然后选择Build Action Content,Copy to always Directory As Copy。

如果您正在使用Install 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 \给出文件名;

答案 3 :(得分: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