2014-04-24 10 views
6

użyłemKrótkie filename powodując problemy z dwóch identycznych Ścieżki

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

aby utworzyć tymczasowy plik i przechowywane wracającą Path.

Mam Eclipse IFile zasobu związany z pliku tymczasowego utworzonego:

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

Jeśli chcę uzyskać Path powrotem z tego zasobu, wzywam

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

Na moim komputerze lokalnym działa to w 100% dobrze. Ale na zdalnej maszynie testowej, mam dwie różne ścieżki:

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

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

Folder Username_Testing i tylko ten folder zostanie przekształcony w krótkiej nazwy pliku, a jedynie na mój bezpośredni stworzenie go jako tymczasowego.

Te dwie ścieżki nie są uznawane za równe przez Path.equals(...), co powoduje awarię moich testów na zdalnej maszynie.

Generalnie to mnie denerwuje przy użyciu Path.equals(...), mimo że w rzeczywistej rzeczywistej pracy aplikacji nie miałem jeszcze żadnych problemów. Czy istnieje sposób, w jaki mogę wymusić na systemie zawsze używanie długich nazw plików? Czy jest coś, czego mi brakuje, powinienem być świadomy, kiedy robię kontrole równości ścieżek, czy konwertuję ścieżki z jednej formy do drugiej?

Aktualizacja nr 1: Ten konkretny problem jest spowodowany przez% TEMP% na docelowym komputerze z systemem Windows zwracającym ścieżkę przy użyciu krótkiej nazwy pliku, która nie występuje na moim komputerze lokalnym. Tylko kod testowy tworzy tymczasowe pliki i foldery, więc nie ma to wpływu na rzeczywistą aplikację. Oczywistym rozwiązaniem mojego obecnego problemu jest fix% TEMP%, więc testy przebiegają dobrze w obu miejscach, ale to rozwiązanie nie jest opłacalne w sensie ogólnym. Byłoby miło, gdyby istniał sposób na naprawienie sytuacji bez modyfikowania komputera docelowego lub przeskakiwania do kodu macierzystego lub specyficznego dla systemu Windows, ponieważ nie użyłem takiego kodu bezpośrednio, aby uzyskać obie ścieżki.

Odpowiedz

2

Znalazłem dobre, przenośne rozwiązanie mojego problemu, nie trzeba używać żadnego kodu specyficznego dla platformy.Odpowiedź jest całkiem prosta:

Path.toRealPath()

stosować coś takiego:

Path correctedTempFile = tempFile.toRealPath()

Zasadniczo, to teraz przy użyciu wersji toRealPath(), która na szczęście usuwa krótkie nazwy plików, dla porównania przeciwko inne Ścieżki pobrane z zasobów Eclipse. Wierzę, że implementacja Eclipse używa tylko długich ścieżek dla spójności, więc ja z kolei użyję toRealPath, aby pozbyć się wszelkich potencjalnych ścieżek, które mogą używać krótkich nazw plików

1

To pytanie może pomóc:

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

można uzyskać krótką ścieżkę i porównać wygenerowaną ścieżkę przeciwko obu więc wiesz, który z nich korzystać.

+0

Rozwiązania, które są powiązane, są specyficzne dla systemu Windows; Wolałbym bardziej przenośne rozwiązanie. Poza tym wydaje się, że konwersja do krótkiej nazwy pliku nie powinna być prostą czynnością, ale dostałem ją z 'Files.createTempFile', bez żadnego dodatkowego kodu rodzimego kodu. –

+0

Krótkie ścieżki są oknami tylko o ile wiem. –

+0

Doceniam twoją odpowiedź, jednak łatwiej było i łatwiej przenosić z krótkich ścieżek nazw plików na długie ścieżki nazw plików (ponieważ wydaje się, że jest to standard w Eclipse) w przeciwieństwie do konwersji na krótkie ścieżki nazw plików. –