将绝对路径转换为相对路径C#

时间:2012-10-22 20:34:47

标签: c# .net

  

可能重复:
  Getting path relative to the current working directory?

我在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");
  } 

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

3 个答案:

答案 0 :(得分:12)

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

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

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

2)创建与.csproj

相同级别的图像文件夹

3)将一些文件放在images文件夹中

4)将此示例代码放在main方法中 -

    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)中放置的所有文件的相对路径。

答案 1 :(得分:4)

请参阅:Getting path relative to the current working directory?

Uri uri1 = new Uri(@"c:\foo\bar\blop\blap");
Uri uri2 = new Uri(@"c:\foo\bar\");
string relativePath = uri2.MakeRelativeUri(uri1).ToString();

答案 2 :(得分:1)

根据程序的设置,您可以通过跳过完整路径字符串的一部分来简单地使用相对路径。它不是可以吹嘘的,所以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); }

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