Issue in File::getRelativePathFrom


#1

The following code should return an empty string but it doesn’t

  juce::File a = juce::File::getSpecialLocation(juce::File::SpecialLocationType::commonApplicationDataDirectory);
  juce::File b = juce::File::getSpecialLocation(juce::File::SpecialLocationType::commonApplicationDataDirectory);
  juce::String rel = a.getRelativePathFrom(b);

Thanks !


#2

No… not sure that it should return an empty string.

I’d actually expect it to return something like “…/foo.txt”. What does it return?


#3

well it does returns …/LastChildOfThePath
but it do not make sense imho.

I’m only talking in the case where both path are exactly the same right ?


#4

I think it’s doing the right thing then. An empty string is used as a kind of error, like it says in the docs, that’s returned if the paths are invalid.


#5

I disagree regarding the good behavior but I see how you cannot break the current behavior of returning an empty string as an error.
That’s life.


#6

I think the behaviour’s the right thing - typically you’d use this to create a string that’s stored somewhere and which would make no sense to be blank, e.g. the projucer uses it extensively to create relative paths inside projects where a blank string would be meaningless, but a partial path would be fine.


#7

as a middle ground
./
would make more sense.


#8

+1, depending if “a” is a file or a directory…


#9

if I remember correctly
. is for a file
./ is for a directory


#10

my main grip with the current behavior and as you said it is used in Projucer, is that if I store this path and rename the directory, then the path is wrong even though it would have worked as those are in he same directory.
Seems bogus to me.


#11

In the soon to be std::filesystem::path

boost::filesystem::path a("C:\\Windows");
boost::filesystem::path b("C:\\Windows");
auto rel = boost::filesystem::relative(a, b);

rel equals .

No distinction between dir or file


#12

OK, I guess ‘.’ is a reasonable return value if the files are the same.

This of course assumes that they’re both referring to a folder, not a file, but the method isn’t supposed to be given a file anyway, so if you do that you’re already on shaky ground!