Nicolas: lokales Verzeichnis anzeigen

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

  1. 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

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
  2. 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

    1. 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...

      1. 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;  
           }  
          }  
        
        
        1. 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
          
          1. 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;  
             }  
            }  
            
            
            1. 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

              1. 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.