2014-04-24 10 views
6

ho usatobrevi nomi di file che causa problemi con due percorsi altrimenti identici

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

per creare un file temporaneo e memorizzato il restituita Path.

Ho un IFile risorsa Eclipse legata al file temporaneo che ho creato:

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

Se voglio ottenere un Path indietro da questa risorsa, io chiamo

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

Sulla mia macchina locale, funziona perfettamente al 100%. Ma su una macchina di prova a distanza, ottengo due diversi percorsi:

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

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

La cartella Username_Testing e solo quella cartella si lascia girare in una breve il nome del file, e solo per la mia diretta la creazione di esso come un temporaneo.

Questi due percorsi non sono considerati uguali da Path.equals(...), causando un errore dei test sulla macchina remota.

In generale, questo mi rende un po 'nervoso usando Path.equals(...) anche se nel reale funzionamento reale dell'applicazione non ho ancora avuto problemi. C'è un modo in cui posso forzare il sistema a sempre a utilizzare nomi di file lunghi? C'è qualcosa che mi manca di cui dovrei essere a conoscenza quando eseguo i controlli di uguaglianza dei percorsi o quando converti i percorsi da una forma all'altra?

Aggiornamento n. 1: questo problema specifico è causato da% TEMP% sul computer Windows di destinazione che restituisce un percorso utilizzando un nome file breve, che non si verifica sul mio computer locale. Solo il codice di test crea file e cartelle temporanei, quindi questo non influirà sull'applicazione reale. La soluzione ovvia al mio problema attuale è la correzione% TEMP%, quindi i test funzionano bene in entrambi i casi, ma questa soluzione non è praticabile in senso generale. Sarebbe bello se ci fosse un modo per correggere la situazione senza modificare il computer di destinazione o saltare in codice nativo o specifico di Windows, dal momento che non ho usato tale codice direttamente per ottenere entrambi i percorsi.

risposta

2

Ho trovato una soluzione valida e portatile per il mio problema, non è necessario utilizzare alcun codice specifico della piattaforma.La risposta è in realtà abbastanza semplice:

Path.toRealPath()

usato qualcosa di simile:

Path correctedTempFile = tempFile.toRealPath()

In sostanza, si sta ora utilizzando la versione toRealPath(), che rimuove per fortuna brevi nomi di file, per i confronti contro altri percorsi tratti dalle risorse di Eclipse. Credo che l'implementazione di Eclipse stia utilizzando solo percorsi lunghi per coerenza, quindi userò a turno toRealPath per eliminare potenziali percorsi che potrebbero utilizzare nomi di file brevi

1

Questa domanda potrebbe aiutare:

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

è possibile ottenere il percorso breve e confrontare il percorso generato sia contro in modo da sapere quale usare.

+0

Le soluzioni collegate sono molto specifiche di Windows; Preferirei una soluzione più portatile. Inoltre, sembra che la conversione in un nome di file breve non sia una cosa semplice da fare, eppure ho ottenuto il mio da 'Files.createTempFile', senza alcun trucco aggiuntivo di codice nativo. I nomi di percorso brevi –

+0

sono di Windows solo per quanto ne so. –

+0

Apprezzo la tua risposta, tuttavia è stato più facile e più portabile convertire da percorsi di file brevi a percorsi di nomi di file lunghi (poiché sembra essere lo standard con Eclipse) anziché convertire in percorsi di nome file brevi. –

Problemi correlati