Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Short filename causing issues with two otherwise identical Paths

I used

Files.createTempFile("Hello", "txt");

to create a temporary file and stored the returned Path.

I have an Eclipse IFile resource linked to the temporary file I created:

linkedFile.createLink(tempFile.toUri(), IResource.NONE, null);

If I want to get a Path back from this resource, I call

linkedFile.getLocation().toFile().toPath()

On my local machine, this works 100% fine. But on a remote test machine, I get two different paths:

from Files.createTempFile: C:\Users\USERNA~1\AppData\Local\Temp\Hello3606197456871226795txt

from getLocation().toFile().toPath() C:\Users\Username_Testing\AppData\Local\Temp\Hello3606197456871226795txt

The Folder Username_Testing and only that folder gets turned into a short filename, and only for my direct creation of it as a temporary.

These two paths are not considered equal by Path.equals(...), which is causing a failing of my tests on the remote machine.

In general, this makes me a bit nervous using Path.equals(...) even though in the actual real operation of the application I haven't had any issues yet. Is there a way I can force the system to always use long filenames? Is there something I'm missing that I should be aware of when I do path equality checks, or when converting paths from one form to another?

Update #1: This specific issue is caused by %TEMP% on the target windows machine returning a path using a short filename, that doesn't happen on my local machine. Only test code creates temporary files and folders so this won't affect the real application. The obvious solution to my current problem is fix %TEMP% so the tests run fine in both places, but this solution is not viable in the general sense. It would be nice if there was a way to rectify the situation without modifying the target computer or jumping into native or windows specific code, since I used no such code directly to get both paths.

like image 499
Erika Redmark Avatar asked Apr 24 '14 20:04

Erika Redmark


2 Answers

I found a good, portable solution to my problem, no need to use any platform-specific code. The answer is actually quite simple:

Path.toRealPath()

used something like this:

Path correctedTempFile = tempFile.toRealPath()

Essentially, it is now using the toRealPath() version, which thankfully removes the short filenames, for comparisons against other Paths taken from Eclipse resources. I believe the Eclipse implementation is using only long paths for consistency, so I in turn will use toRealPath to get rid of any potential paths that may use short filenames

like image 170
Erika Redmark Avatar answered Nov 01 '22 19:11

Erika Redmark


This question might help:

Is there a way to generate the 8.3 or 'short' (Windows) version of a file name in Java?

You can get the short path and compare the generated path against both so you know which one to use.

like image 41
Harry Blargle Avatar answered Nov 01 '22 17:11

Harry Blargle