2009-05-04 7 views
10

Comment obtenir le répertoire d'un fichier?Obtenir le répertoire d'un nom de fichier en Javascript

Par exemple, je passe dans une chaîne

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

Je veux une fonction qui me retourne

C:\Program Files\nant\bin 

Je préférerais une fonction intégrée qui fait le travail, au lieu d'avoir la main diviser la chaîne et exclure le dernier.

Edit: Je suis en cours d'exécution sur Windows

+0

Vous devez nous dire dans quel environnement il fonctionne pour répondre correctement à cette question. – Anonymous

+0

@Anonyme, très bon point. Vous ne considérez utiliser ma réponse que si vous êtes sur Windows et quelque chose qui supporte COM. – Ash

+0

vraiment espérer que ce n'est pas dans un navigateur Web comme split() ou lastIndexOf serait beaucoup mieux que FileSystemObject –

Répondre

15

Je ne sais pas s'il y a une fonctionnalité intégrée pour cela, mais il est assez simple pour obtenir le chemin.

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

Votre solution ne fonctionnera que sur Windows. Linux utilise '/' à la place. Il est préférable d'utiliser une solution indépendante du système d'exploitation. –

+1

@Nadia la question est sur Windows et les séparateurs de chemin pourraient être le moindre de ses préoccupations avec la portabilité, nous n'avons pas vu le code ou savoir ce qu'il utilise pour –

-2

Le noyau du langage Javascript ne fournit pas les fonctions de fichiers/io. Cependant, si vous travaillez dans un système d'exploitation Windows, vous pouvez utiliser FileSystemObject (ActiveX/COM). Remarque: ne l'utilisez pas dans le script côté client d'une application Web, mais dans d'autres domaines, tels que l'hôte de script Windows ou le côté serveur d'une application Web, où vous avez plus de contrôle sur la plateforme.

This page fournit un bon tutoriel sur la façon de procéder.

Voici un exemple difficile à faire ce que vous voulez:

var fso, targetFilePath,fileObj,folderObj; 

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

    fileObj = fso.GetFile(targetFilePath); 

    folderObj=fileObj.ParentFolder; 

    alert(folderObj.Path); 
+3

Um ... Je suis sûr que le questionneur voulait juste une fonction de manipulation de chaîne simple, pas l'accès au système de fichiers! – brianpeiris

+1

Utiliser ActiveX n'est pas une bonne idée. Cela ne fonctionnera que sur IE. Cela ne marchera pas sur Firefox ni sur aucun autre navigateur. –

+1

@brianpeiris, S'il vous plaît lire attentivement la question. Ils disent: "au lieu d'avoir divisé manuellement la chaîne et d'exclure la dernière" – Ash

7

Il n'y a pas une solution parfaite, et il est parce que cette fonctionnalité ne se construit pas en aucune façon d'obtenir le système de fichiers séparateur. Vous pouvez essayer:

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

Et cela?

Si n'est pas un programme addressFile, retour 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

Utilisation:

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

* Les réponses qui sont basées sur lastIndexOf ('/') ou lastIndexOf ('\') sont sujettes aux erreurs car le chemin peut être "c: \ aa/bb \ cc/dd".
(Matthew Flaschen l'a fait en tenant compte, donc ma réponse est une alternative regex)

2

Nous sommes désolés d'avoir ramené cela, mais nous cherchions aussi une solution sans faire deux fois référence à la variable. Je suis venu avec ce qui suit:

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 

C'est un peu d'une promenade à travers la manipulation d'une chaîne à tableau et en arrière, mais il est assez propre je pense.

Questions connexes