2013-08-20 8 views
6

Nella mia app node.js ho funzioni che possono essere passate oNODE.JS - come gestire correttamente un mix di OS e "percorsi" in stile URL?

percorsi in stile OS, ad es. c: \ my \ docs \ mydoc.doc (o /usr/docs/mydoc.doc o qualunque cosa sia locale)

URL di file, ad es. file: // c: /my/docs/mydoc.doc (che non sono sicuro della validità di '\' s in ??)

In entrambi i casi, ho bisogno di controllare per vedere se si riferiscono a una posizione specifica che esisterà sempre come un percorso in stile OS locale, ad es c: \ mydata \ directory \ o/usr/mydata/directory

Ovviamente per percorsi in stile OS posso solo confrontarli come stringhe - DOVREBBE essere sempre gli stessi (sono creati con percorso) ma FILE:// URLS non usa necessariamente path.sep e quindi non "stringa corrisponde"?

Qualsiasi suggerimento per quanto riguarda il modo migliore per gestire questo (sto personalmente tentato di rompere tutto da uno-o-più tagli di entrambi sorta e quindi controllare ogni pezzo ??

+0

Percorso di controllo (http://nodejs.org/api/path.html). Questo dovrebbe aiutarti. – fakewaffle

+0

Sto già usando Path - il problema è che non capisco gli URL come file: // e il separatore non corrisponderà necessariamente al sistema operativo !? – shrewdlogarithm

+0

Usando (sotto Windows) del codice nodejs (sviluppato sotto linux), mi sono ritrovato a volte con "/" e "\" nello stesso * percorso * del file! – Fuhrmanator

risposta

0

basta fare qualche manipolazione del corda e controllare per assicurarsi che essi sono gli stessi dopo la correzione per le differenze:

var path = require('path'); 
var pathname = "\\usr\\home\\newbeb01\\Desktop\\testinput.txt"; 
var pathname2 = "file://usr/home/newbeb01/Desktop/testinput.txt" 

if(PreparePathNameForComparing(pathname) == PreparePathNameForComparing(pathname2)) 
{ console.log("Same path"); } 
else 
{ console.log("Not the same path"); } 

function PreparePathNameForComparing(pathname) 
{ 
    var returnString = pathname; 
    //try to find the file uri prefix, if there strip it off 
    if(pathname.search("file://") != -1 || pathname.search("FILE://") != -1) 
    { returnString = pathname.substring(6, pathname.length); } 

    //now make all slashes the same 
    if(path.sep === '\\') //replace all '/' with '\\' 
    { returnString = returnString.replace(/\//g, '\\'); } 
    else //replace all '\\' with '/' 
    { returnString = returnString.replace(/\\/g, '/'); } 

    return returnString; 
} 

ho controllato per vedere se il "file: //" URI indicatore nome del percorso era lì, in caso affermativo, ho eliminato il mio confronta stringa, quindi mi normalizzo in base al percorso che il modulo del percorso del separatore del percorso mi fornirà, in questo modo dovrebbe funzionare in ambiente Linux o Windows

+0

Questo è il tipo di cosa che avevo in mente - solo il problema è che non sono convinto che il file: // URL non avrà \ 's o anche un mix di entrambi (sono interessato solo a Chrome qui ma so che alcuni browser supportano entrambi/mixed)? Quindi perché sono stato tentato solo di buttare via TUTTI i separatori e confrontare il resto !? – shrewdlogarithm

+0

Se vuoi semplicemente renderli tutti uguali a prescindere da un mix pazzesco che potrebbe apparire, puoi semplicemente sostituirli tutti con, o "" o qualcosa del genere. Puoi farlo con: returnString = returnString (/ [\\ /] + /, ","); questo sostituirà tutti '\' e '/' in singoli o multipli con ',' quindi non dovresti più preoccuparti di loro. Basta usare quel codice invece del if else nella mia funzione e dovresti ottenere ciò che stai cercando. – Brian

+0

Ho accettato questo perché contiene, in sostanza, la risposta giusta. L'altra soluzione "sfrutta" le capacità del percorso: è quella che sto utilizzando, ma per i futuri visitatori la soluzione è la stessa: basta rimuovere il protocollo (file: //) e quindi modificare tutte le possibili barre nel percorso locale. ... – shrewdlogarithm

7

Ho intenzione di postare la mia opinione su questo - come proveniva da un suggerimento che ho ricevuto da qualcuno su Facebook (no - davvero!) E utilizza il percorso in un modo che probabilmente non era destinato - ad es. Non sono sicuro che sia la giusta "soluzione" - non sono sicuro di non sfruttare il percorso un po '.

Il suggerimento di Facebook è che quel percorso è in realtà solo un'utilità per passare stringhe con separatori "/" e "\" - ignora tutto il resto - non si preoccupa di cosa ci sia dentro.

Su questa base, possiamo usare

path.normalize(ourpath) 

che convertirà tutti i separatori a quelli del sistema operativo locale preferito (path.sep)

Ciò significa che abbineranno il mio elenco in stile OS (che è anche fatto con il percorso) e quindi posso confrontare quelli - senza ricorrere a barre verticali a sventrare ...

es.

Prima

file://awkward/use/of\\slashes\in/this/path 

Dopo

file:\awkward\use\of\slashes\in\this\path (Windows) 

o

file:/awkward/use/of/slashes/in/this/path (everywhere else) 

Rimozione file:// prima (o file: + path.sep dopo) = percorso in stile OS locale !?

+0

Funziona per me! Ed è esattamente il motivo per cui tutte le funzioni del nodo integrato non si preoccupano di percorsi come C: \ whatever \ e/then/unix/slashes.txt –

Problemi correlati