9

可能重复:
获取相对于当前工作目录的路径?

我在 C# 中有代码,其中包含一些从绝对路径到相对路径的图像,因此无论应用程序折叠位于何处,都可以找到该图像。

例如,我的代码(以及我的笔记本电脑中的图像)中的路径是

C:/something/res/images/image1.jpeg

我希望我的代码中的路径是

..../images/image1.jpeg 

所以它可以在文件夹所在的任何地方运行,无论C:分区的名称是什么等。

我想在我的代码中有一个独立于应用程序文件夹位置的路径,或者它是否在另一个分区中,只要它与解决方案的其余部分位于同一文件夹中。

我有这个代码:

 try 
 { 
     File.Delete("C:/JPD/SCRAT/Desktop/Project/Resources/images/image1.jpeg");
 } 
 catch (Exception) 
 { 
      MessageBox.Show("File not found:C:/Users/JPD/Desktop/Project/images/image1.jpeg");
  } 

仅当文件和文件夹位于该特定路径中时,此代码才会运行(这也是代码的位置)我希望该路径是相对的,因此无论我放置整个文件夹(代码、文件等),程序仍将只要代码(位于项目文件夹下)与文件夹图像位于同一位置,就可以工作......我该怎么办?

4

3 回答 3

12

相对路径基于运行应用程序的二进制文件。默认情况下,您的二进制文件将输出到[directory of your .csproj]/bin/debug. 因此,假设您想创建与 .csproj 相同级别的图像文件夹。然后您可以使用相对路径“../../images/someImage.jpg”访问您的图像。

为了更好地了解这一点,请尝试以下测试:

1)创建一个新的visual studio示例项目,

2) 创建与 .csproj 相同级别的图像文件夹

3)将一些文件放在图像文件夹中

4)将此示例代码放入您的主要方法中 -

    static void Main(string[] args)
    {
        Console.WriteLine(Directory.GetCurrentDirectory());
        foreach (string s in Directory.EnumerateFiles("../../images/"))
        {
            Console.WriteLine(s); 
        }
        Console.ReadLine(); // Just to keep the console from disappearing.
    }

您应该会看到您在步骤 (3) 中放置的所有文件的相对路径。

于 2012-10-22T21:26:54.087 回答
8

请参阅:获取相对于当前工作目录的路径?

Uri uri1 = new Uri(@"c:\foo\bar\blop\blap");
Uri uri2 = new Uri(@"c:\foo\bar\");
string relativePath = uri2.MakeRelativeUri(uri1).ToString();
于 2012-10-22T20:38:44.833 回答
0

根据程序的设置,您可以通过跳过完整路径字符串的一部分来简单地使用相对路径。这不是吹牛的,所以 J.Skit 可能是我的闪亮之处,但我得到的印象是你只是想让它工作。美丽是后来的问题。

String absolutePath = @"c:\beep\boop\HereWeStart\hopp.gif";
String relativePath = absolutePath.Substring(13);

然后,如果您需要/希望,您可以将数字 13(这是一种丑陋且不受欢迎的方法,但仍然有效)交换为动态计算的数字。例如(假设您的相对路径开始的目录“HereWeStart”是该字符串在 中的第一次出现absolutePath)您可以按如下方式进行。

String absolutePath = @"c:\beep\boop\HereWeStart\hopp.gif";
int relativePathStartIndex = absolutePath.IndexOf("HereWeStart");
String relativePath = absolutePath.Substring(relativePathStartIndex);

另外,你的问题引出了另一个问题。我想知道你是如何获得绝对路径的。也许有一种更聪明的方法可以一起避免喧嚣?

编辑

您也可以尝试以下方法。忘记Directory给你一个绝对路径的类。直接走相对路径。我假设您尝试删除的所有文件都在同一个目录中。如果没有,您将需要添加更多线路,但当我们到达那里时,我们会越过那座桥。

不要忘记将答案标记为绿色检查(或解释仍然缺少或可改进的内容)。

String
  deletableTarget = @"\images\image1.jpeg", 
  hereWeAre = Environment.CurrentDirectory;
MessageBox.Show("The taget path is:\n" + hereWeAre + deletableTarget);

try
{ File.Delete(hereWeAre + deletableTarget); }
catch (Exception exception)
{ MessageBox.Show(exception.Message); }

另外,请注意我冒昧地更改了您的异常处理。当您工作正常时,依靠内置消息传递系统是一种更好的方式。这样,您将获得更专业的错误消息。并不是说我们在运行时会遇到任何错误,对吧?;)

于 2012-10-22T21:11:12.473 回答