Comment lister le contenu d'un répertoire IN ORDER avec node.js?
Je suis assez expérimenté programmeur et j'ai tout récemment découvert node.js. J'aime JavaScript car c'est là que j'ai commencé (Développement Web) afin d'être capable d'écrire du code côté serveur avec son est incroyable.
Actuellement, je travaille sur un exercice simple, un WebSocket/serveur HTTP, et j'ai commencé à ajouter un répertoire de la liste de fonction quand je suis tombé sur une légère gêne: quand je liste de répertoires et de fichiers dans un répertoire qu'ils ne sont pas dans n'importe quel ordre. Je voudrais la liste des répertoires d'abord, les fichiers de seconde que par ordre alphabétique (comme le 'ls' de la commande). J'ai le sentiment que sa parce que sa asynchronus mais je ne suis pas totalement positif. Toute aide serait appréciée.
BTW, voici mon code:
var sys = require("sys");
var ws = require('websocket-server');
var fs = require("fs");
var path = require("path");
var url = require("url");
function log(data){
sys.log("\033[0;32m"+data+"\033[0m");
}
var server = ws.createServer();
server.listen(3400);
log("Listening on 3400 for HTTP and WS");
server.addListener("request", function(request, response){
log("HTTP: Connected: " + request.connection.remoteAddress);
var uri = url.parse(request.url).pathname;
var filename = path.join("/home/brandon", uri);
log("HTTP: " + request.connection.remoteAddress + " Requested: " + filename);
path.exists(filename, function(exists) {
if(!exists) {
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 Not Found\n");
log("HTTP: " + filename + " Does Not Exist. 404 returned to " + request.connection.remoteAddress);
response.end();
log("HTTP: Disconnected: " + request.connection.remoteAddress);
return;
}
fs.readFile(filename, "binary", function(err, file) {
if(err) {
if(err.errno === 21){
fs.readdir(filename, function(err1, files){
if(err1){
response.writeHead(500, {"Content-Type": "text/plain"});
response.write("Error when reading directory: " + err1 + "\n");
log("HTTP: " + filename + " Could Not Be Read. 500 returned to " + request.connection.remoteAddress);
response.end();
log("HTTP: Disconnected: " + request.connection.remoteAddress);
return;
} else {
response.writeHead(200);
response.write("<HTML><HEAD><title>Directory Listing for " + uri + "</title></HEAD><BODY><h1>Directory Listing for " + uri + "</h1>");
response.write("<ul>");
function printBr(element, index, array) {
response.write("<li>" + element + "</li>");
}
/*for( i in files ){
response.write("<li>" + files[i] + "</li>");
}*/
files.forEach(printBr);
response.write("</ul>");
response.write("</BODY></HTML>");
log("HTTP: Directory listing for " + filename + " sent to " + request.connection.remoteAddress);
response.end();
log("HTTP: Disconnected: " + request.connection.remoteAddress);
return;
}
});
return;
}
response.writeHead(500, {"Content-Type": "text/plain"});
response.write("Error when reading file: " + err + "\n");
log("HTTP: " + filename + " Could Not Be Read. 500 returned to " + request.connection.remoteAddress);
response.end();
log("HTTP: Disconnected: " + request.connection.remoteAddress);
return;
}
response.writeHead(200);
response.write(file, "binary");
log("HTTP: " + filename + " Read and Sent to " + request.connection.remoteAddress);
response.end();
log("HTTP: Disconnected: " + request.connection.remoteAddress);
});
});
});
server.addListener("connection", function(conn){
log(conn.id + ": new connection");
server.broadcast("New Connection: "+conn.id);
conn.addListener("readyStateChange", function(readyState){
log("stateChanged: "+readyState);
});
conn.addListener("close", function(){
var c = this;
log(c.id + ": Connection Closed");
server.broadcast("Connection Closed: "+c.id);
});
conn.addListener("message", function(message){
log(conn.id + ": "+JSON.stringify(message));
server.broadcast(conn.id + ": "+message);
});
});
Et voici le résultat dans le navigateur:
**RÉSOLU:**
Grâce à @Samir, j'ai trouvé comment faire exactement ce que je voulais faire. J'ai réitéré par le choix du répertoire et de son contenu, vérifier si un élément a été un répertoire ou un fichier, séparé en deux tableaux ('dirs_in' de dirs et de "files_in' pour les fichiers), triées de la deux tableaux par ordre alphabétique, et enfin écrit.
Code (Lignes 42-70):
response.writeHead(200);
response.write("<HTML><HEAD><title>Directory Listing for " + uri + "</title></HEAD><BODY><h1>Directory Listing for " + uri + "</h1>");
response.write("<ul>");
function printBr(element, index, array) {
response.write("<li>" + element);
if( fs.statSync( path.join(filename + element) ).isDirectory() ){
response.write(" is a <b>dir</b>");
} else {
response.write(" is a <b>file</b>");
}
response.write("</li>");
}
var dirs_in = [];
var files_in = [];
function sep(element, index, array) {
if( fs.statSync( path.join(filename + element) ).isDirectory() ){
dirs_in.push(element);
} else {
files_in.push(element);
}
}
files.forEach(sep);
dirs_in.sort().forEach(printBr);
files_in.sort().forEach(printBr);
response.write("</ul>");
response.write("</BODY></HTML>");
log("HTTP: Directory listing for " + filename + " sent to " + request.connection.remoteAddress);
response.end();
log("HTTP: Disconnected: " + request.connection.remoteAddress);
Navigateur De Sortie:
P. S. je vais supprimer le 'est un dir" et "est un fichier". Ils étaient juste pour le test.
source d'informationauteur Brandon
Vous devez vous connecter pour publier un commentaire.
Si vous le souhaitez ordonnée par nom, vous pouvez les appeler
sort()
sur le tableau en premier.Par exemple, si vous souhaitez trier les répertoires d'abord, puis vous avez besoin pour obtenir plus de renseignements. Une implémentation naïve consisterait à interroger les stats de chaque fichier dans le tri en fonction de comparaison:
La
localCompare
méthode est ce que lesort
méthode utilise par défaut de la fonction de comparaison, nous avons donc déléguer à qui si ils sont à la fois sur "l'égalité". Vous pouvez étendre sur ce que nécessaire. Je voudrais aussi vous recommandons de stocker le résultat deisDirectory
dans une carte ou quelque chose, à tout le moins. En outre,statSync
est bon pour les besoins de la démonstration, mais pas dans le code de production. Utilisationstat
à la place. Ce ne conduisent à un peu plus de code complexe, mais les avantages de l'asynchrone comportement en valent la peine.