2009-05-04 1 views
10

Как получить каталог файла?Получить каталог имени файла в Javascript

Например, я прохожу в строке

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

Я хочу функцию, которая возвращает меня

C:\Program Files\nant\bin 

Я предпочел бы встроенную функцию, которая делает работу, вместо того, чтобы вручную разделите строку и исключите последнюю.

Edit: я бегу на Windows,

+0

Вы должны сообщить нам, в какой среде это работает, чтобы адекватно ответить на этот вопрос. – Anonymous

+0

@ Анонимный, очень хороший момент. Вы бы только подумали о том, чтобы использовать мой ответ, если вы работаете в Windows и что-то, что поддерживает COM. – Ash

+0

действительно надеется, что это не в веб-браузере, так как split() или lastIndexOf будет намного лучше, чем FileSystemObject –

ответ

15

Я не знаю, если есть какой-либо встроенные функции для этого, но это довольно прямо вперед, чтобы получить путь.

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

Ваше решение будет работать только на окнах. Вместо этого Linux использует '/'. Лучше использовать независимое от ОС решение. –

+1

@ Надя вопрос о Windows и разделители путей могут быть наименьшим из его проблем с переносимостью, мы не видели код или не знаем, что он использует для –

-2

Ядром Javascript язык не предоставляет файл/Io функции. Однако, если вы работаете в ОС Windows, вы можете использовать FileSystemObject (ActiveX/COM).

Примечание: не используйте это в скрипте на стороне скрипта веб-приложения на стороне клиента, хотя это лучше всего в других областях, например, в хосте сценария Windows или на стороне сервера веб-приложения, где у вас больше контроля над Платформа.

This page содержит хороший учебник о том, как это сделать.

Вот грубый пример, чтобы сделать то, что вы хотите:

var fso, targetFilePath,fileObj,folderObj; 

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

    fileObj = fso.GetFile(targetFilePath); 

    folderObj=fileObj.ParentFolder; 

    alert(folderObj.Path); 
+3

Ум ... Я почти уверен, что вопросник просто хотел простую функцию манипуляции строкой, а не доступ к файловой системе! – brianpeiris

+1

Использование activeX - не очень хорошая идея. Это будет работать только на IE. Он не будет работать в Firefox или в любом другом браузере. –

+1

@brianpeiris, внимательно прочитайте. Они говорят: «вместо того, чтобы вручную разделить строку и исключить последнюю» – Ash

7

Там не идеальное решение, так как эта функция не встроенная, и нет никакого способа, чтобы получить файл-разделитель системы. Вы можете попробовать:

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

И это?

Если это не программа в addressFile, возвращение 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

Использование:

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

* Ответы, которые основаны на LastIndexOf ('/') или LastIndexOf ('\') подвержены ошибкам, потому что путь может быть «c: \ aa/bb \ cc/dd».
(Matthew Flaschen действительно учитывал это, поэтому мой ответ является альтернативой регулярному выражению)

2

Извините, что принесли это обратно, но также искали решение без ссылки на переменную дважды. Я придумал следующее:

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 

Это немного гуляет, манипулируя строку в массив и обратно, но это чистое достаточно, я думаю.

Смежные вопросы