2009-05-04 13 views
10

Jak uzyskać katalog pliku?Uzyskaj katalog nazwy pliku w języku JavaScript

Na przykład, ja przechodzę na sznurku

C:\Program Files\nant\bin\nant.exe 

chcę funkcję zwracającą mi

C:\Program Files\nant\bin 

wolałbym wbudowaną funkcję, która wykonuje pracę, zamiast ręcznie podziel łańcuch i wyklucz ostatni.

Edit: Mam zainstalowany Windows

+0

Musisz nam powiedzieć, jakie środowisko działa, aby odpowiedzieć na to pytanie w odpowiedni sposób. – Anonymous

+0

@ Anonimowy, bardzo dobry punkt. Zastanawiasz się tylko nad użyciem mojej odpowiedzi, jeśli jesteś w systemie Windows i czymś, co obsługuje COM. – Ash

+0

Naprawdę mam nadzieję, że nie w przeglądarce internetowej jako split() lub lastIndexOf byłoby znacznie lepsze niż FileSystemObject –

Odpowiedz

15

Nie wiem, czy jest jakiś wbudowany w funkcjonalności dla tego, ale jest to dość proste, aby uzyskać ścieżkę.

path = path.substring(0,path.lastIndexOf("\\")+1); 
+4

Twoje rozwiązanie działa tylko w systemie Windows. Linux używa zamiast tego "/". Lepiej jest używać niezależnego od systemu operacyjnego rozwiązania. –

+1

@Nadia pytanie dotyczy systemu Windows, a separatory ścieżek mogą być najmniejsze z jego problemów związanych z przenoszeniem, nie widzieliśmy kodu ani nie wiemy, do czego on go używa –

-2

Rdzeń język JavaScript nie przewiduje plików/funkcje IO. Jednak jeśli pracujesz w systemie operacyjnym Windows, możesz użyć FileSystemObject (ActiveX/COM).

Uwaga: nie używaj tego w skryptach po stronie klienta aplikacji internetowej, ale najlepiej w innych obszarach, takich jak host skryptów systemu Windows lub po stronie serwera aplikacji sieci Web, w której masz większą kontrolę Platforma.

zapewnia dobry samouczek, jak to zrobić.

Oto przykład szorstki robić to, co chcesz:

var fso, targetFilePath,fileObj,folderObj; 

    fso = new ActiveXObject("Scripting.FileSystemObject"); 

    fileObj = fso.GetFile(targetFilePath); 

    folderObj=fileObj.ParentFolder; 

    alert(folderObj.Path); 
+3

Um ... Jestem prawie pewien, że pytający po prostu chciał prostej funkcji manipulowania ciągiem, a nie dostępu do systemu plików! – brianpeiris

+1

Używanie activeX nie jest dobrym pomysłem. To zadziała tylko w IE. Nie będzie działać w Firefoksie ani w żadnej innej przeglądarce. –

+1

@brianpeiris, Przeczytaj uważnie to pytanie. Mówią: "zamiast ręcznie podzielić ciąg i wykluczyć ostatnie" – Ash

7

Nie ma idealnego rozwiązania, ponieważ ta funkcja nie jest wbudowana i nie ma sposobu na uzyskanie systemowego separatora plików. Można spróbować:

path = path.substring(0, Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\"))); 
alert(path); 
2
function getFileDirectory(filePath) { 
    if (filePath.indexOf("/") == -1) { // windows 
    return filePath.substring(0, filePath.lastIndexOf('\\')); 
    } 
    else { // unix 
    return filePath.substring(0, filePath.lastIndexOf('/')); 
    } 
} 
console.assert(getFileDirectory('C:\\Program Files\\nant\\bin\\nant.exe') === 'C:\\Program Files\\nant\\bin'); 
console.assert(getFileDirectory('/usr/bin/nant') === '/usr/bin'); 
1

i to?

Jeśli nie jest to program w addressFile, powrót addressFile

function(addressFile) { 
    var pos = addressFile.lastIndexOf("/"); 
    pos = pos != -1 ? pos : addressFile.lastIndexOf("\\"); 

    if (pos > addressFile.lastIndexOf(".")) { 
     return addressFile; 
    } 

    return addressFile.substring(
     0, 
     pos+1 
    ); 
} 


console.assert(getFileDirectory('C:\\Program Files\\nant\\bin\\nant.exe') === 'C:\\Program Files\\nant\\bin\\'); 
console.assert(getFileDirectory('/usr/bin/nant') === '/usr/bin/nant/'); 
console.assert(getFileDirectory('/usr/thisfolderhaveadot.inhere') === '/usr/'); 
8

Zastosowanie:

var dirname = filename.match(/(.*)[\/\\]/)[1]||''; 

* Odpowiedzi, które są oparte na lastIndexOf ('/') lub lastIndexOf ('\') są podatne na błędy, ponieważ ścieżka może być "c: \ aa/bb \ cc/dd".
(Matthew Flaschen wziął to pod uwagę, więc moja odpowiedź jest alternatywą regex)

2

Przykro nam, że mogę to powtórzyć, ale również szukałem rozwiązania bez odniesienia do zmiennej dwukrotnie. Wpadłem poniżej:

var filepath = 'C:\\Program Files\\nant\\bin\\nant.exe'; 
    // C:\Program Files\nant\bin\nant.exe 
var dirpath = filepath.split('\\').reverse().splice(1).reverse().join('\\'); 
    // C:\Program Files\nant\bin 

To jest trochę spacer poprzez manipulowanie ciąg do tablicy i do tyłu, ale to czysty wystarczająco myślę.

Powiązane problemy