lokales Verzeichnis anzeigen
Nicolas
- javascript
0 Alexander (HH)0 Don P
Hallo zusammen,
für eine simple Aufstellung von Bilddateien müsste ich mit einer lokalen HTML-Datei Verzeichnisinhalte auszulesen (z.B. "D:\Daten\Bilder.html" erstellt eine Liste von Dateien in "D:\Daten\Fotos").
Ich bin mir relativ sicher, dass dies möglich ist mit ActiveX bzw. XUL-Komponenten - habe aber keine Ahnung, wie ich das angehen sollte.
Gibt es hierfür vielleicht bereits eine Funktion, die ein Array mit den jwlg. Dateinamen (sowie Datum und Größe?) zurückgibt? Google war hierbei keine große Hilfe...
Im Voraus besten Dank!
/N
Moin Moin!
Javascript hat im Browser keinen Zugriff auf das lokale Dateisystem. Der einzige Weg für Webseiten, irgendetwas mit lokalen Dateien anzustellen, ist <input type="file">.
(Technisch nicht ganz korrekt: Es gibt Wege, über signierte Java-Applets zu "tunneln", dazu gibt es einen SelfHTML-Artikel. Das ist aber sehr wackelig und Browser-spezifisch.)
Wenn Du Dich auf Windows mit halbwegs aktuellem IE beschränkst, hilft Dir vielleicht eine HTA.
Ansonsten bist Du mit einer Standalone-Applikation (C/C++/C#/VB/Pascal/Java/....) in aller Regel besser bedient.
Alexander
Hallo,
Ich bin mir relativ sicher, dass dies möglich ist mit ActiveX bzw. XUL-Komponenten - habe aber keine Ahnung, wie ich das angehen sollte.
Ja, mit ActiveX im IE geht das:
var fso = new ActiveXObject("Scripting.FileSystemObject");
Google mal nach den Eigenschaften und Methoden von FileSystemObject. Die kannst du dann auf die Variable fso anwenden.
Gruß, Don P
Google mal nach den Eigenschaften und Methoden von FileSystemObject. Die kannst du dann auf die Variable fso anwenden.
Danke, das hat mir geholfen:
<script type="text/javascript">
alert(dirListIE("./").join("\n"));
/**
* retrieves directory contents (for Internet Explorer / ActiveX)
* @param {String} path absolute or relative path to the respective directory
* @param {Boolean} hideFolders do not include sub-folders
* @param {Boolean} hideFiles do not include files
* @return {array} list of folders and files (returns false on error)
* @todo return object with files'/folders' name, size and date
* @todo opionally remove full path from results
*/
function dirListIE(path, hideFolders, hideFiles) {
var fso = new ActiveXObject("Scripting.FileSystemObject");
if(!fso.FolderExists(path)) {
return false; // DEBUG: return empty array?
} else {
var dir = fso.GetFolder(path);
var list = [];
// get subfolders
if(!hideFolders) {
var folders = new Enumerator(dir.SubFolders);
for(; !folders.atEnd(); folders.moveNext()) {
list.push(folders.item());
}
}
// get files
if(!hideFiles) {
var files = new Enumerator(dir.Files);
for(; !files.atEnd(); files.moveNext()) {
list.push(files.item());
}
}
return list;
}
}
</script>
Für Vorschläge zur Optimierung und Erweiterung (siehe @todo) wäre ich dankbar!
Für Mozilla-Browser sollte dies weiterhelfen:
http://developer.mozilla.org/en/docs/Code_snippets:File_I/O#Enumerating_files_in_given_directory
Darum kümmere ich mich dann später...
Javascript hat im Browser keinen Zugriff auf das lokale Dateisystem.
Daher ja der Umweg über ActiveX bzw. XUL...
Kleine Anpassung: Pfadangabe ist nun optional (nutzt standardmäßig das jwlg. Arbeitsverzeichnis):
/**
* retrieves directory contents (for Internet Explorer / ActiveX)
* @param {String} [path] absolute or relative path to the respective directory (using the current working directory by default)
* @param {Boolean} [hideFolders] do not include sub-folders
* @param {Boolean} [hideFiles] do not include files
* @return {array} list of folders and files (returns false on error)
* @todo return object with files'/folders' name, size and date
* @todo opionally remove full path from results
*/
function dirListIE(path, hideFolders, hideFiles) {
if(path === "") { path = "./"; }
var fso = new ActiveXObject("Scripting.FileSystemObject");
if(!fso.FolderExists(path)) {
return false; // DEBUG: return empty array?
} else {
var dir = fso.GetFolder(path);
var list = [];
// get subfolders
if(!hideFolders) {
var folders = new Enumerator(dir.SubFolders);
for(; !folders.atEnd(); folders.moveNext()) {
list.push(folders.item());
}
}
// get files
if(!hideFiles) {
var files = new Enumerator(dir.Files);
for(; !files.atEnd(); files.moveNext()) {
list.push(files.item());
}
}
return list;
}
}
Hallo,
Das sieht ganz gut aus. Gratuliere!
Hier noch ein kleines Bonbon:
statt
if(path === "") { path = "./"; }
könnte man auch den Default-Operator || benutzen, um einen Default-Wert einzusetzen:
> ~~~javascript
> path = path || "./";
Das ist dasselbe wie
path = path ? path : "./";
Natürlich muss sichergestellt sein, dass path immer ein String ist. Das gilt auch für deine Variante.
Gruß, Don P
Das sieht ganz gut aus. Gratuliere!
Danke - fehlt "nur" noch das XUL-Äquivalent, sowie ggf. ein Java-Applet für andere Browser (z.B. Opera)...
statt
if(path === "") { path = "./"; }
könnte man auch den Default-Operator || benutzen
Stimmt, daran hatte ich nicht gedacht - danke!
Natürlich muss sichergestellt sein, dass path immer ein String ist. Das gilt auch für deine Variante.
Naja, ich gehe mal davon aus, dass der jwlg. "Nutzer" die Funktion ordentlich bedienen kann - im Kopf steht ja, dass es sich hierbei um einen String handeln sollte...
Hier der aktualisierte Code:
/**
* retrieves directory contents (for Internet Explorer / ActiveX)
* @param {String} [path] absolute or relative path to the respective directory (using the current working directory by default) -- Note: Windows-style backslashes must be escaped (e.g. "C:\\Windows")
* @param {Boolean} [hideFolders] do not include sub-folders
* @param {Boolean} [hideFiles] do not include files
* @return {Array} list of folders and files (returns false on error)
* @todo return object with files'/folders' name, size and date
* @todo opionally remove full path from results
*/
function dirListIE(path, hideFolders, hideFiles) {
path = path || "./";
var fso = new ActiveXObject("Scripting.FileSystemObject");
if(!fso.FolderExists(path)) {
return false; // DEBUG: return empty array?
} else {
var dir = fso.GetFolder(path);
var list = [];
// get subfolders
if(!hideFolders) {
var folders = new Enumerator(dir.SubFolders);
for(; !folders.atEnd(); folders.moveNext()) {
list.push(folders.item());
}
}
// get files
if(!hideFiles) {
var files = new Enumerator(dir.Files);
for(; !files.atEnd(); files.moveNext()) {
list.push(files.item());
}
}
return list;
}
}
Hallo Nicolas,
was vor allem fehlt ist die Dokumentation der dazu notwendigen (Un-)sicherheitseinstellungen der jeweiligen Browser.
function dirListIE(path, hideFolders, hideFiles) {
Zur Auswahl des Verzeichnisses könntest Du die Funktion nutzen, die Du auf meiner Testseite findest. Dort stehen auch meine Erfahrungswerte, was eingestellt werden muss.
Freundliche Grüße
Vinzenz
Zur Auswahl des Verzeichnisses könntest Du die Funktion nutzen, die Du auf meiner Testseite findest.
Dort stehen auch meine Erfahrungswerte, was eingestellt werden muss.
Danke, werde es mir später mal genauer anschauen.