Programujeme-li aplikaci pro intranet, nebo poslední dobou oblíbené WWW rozhraní ke klientskému programu či lépe službě, bývá poměrně často se opakující úlohou výběr adresáře na lokálním disku. V tomto článku si ukážeme, jak lze takový výběr zrealizovat pomocí JavaScriptu a technologie Windows Scripting Host.

Jako vždy je k nahlédnutí připravena malá ukázka. Po otevření nového okna s ukázkou můžete procházet adresáře (složky) na svém lokálním disku C:, přičemž skript zobrazuje celou cestu k aktuálně vybranému adresáři a všechny jeho podadresáře. Pro korektní funkci je zapotřebí prohlížeč Microsoft Internet Explorer verze aspoň 4 (příklad byl testován na verzi 5.5) se zapnutými ovládacími prvky ActiveX. Dále musí být v klientském počítači nainstalovány knihovny Windows Scripting Host. (Pokud používáte některý z modernějších antivirů nebo osobní firewall, je nutné povolit provádění skriptu.) Po stisku tlačítka „Vybrat“ dojde k odeslání formuláře, obsahujícího ve skrytém poli path aktuálně vybraný adresář včetně celé cesty (v ukázce je místo toho pouze zobrazeno informační okno).

Popis kódu

V hlavičce stránky získáme z parametrů stránky aktuální cestu, kterou máme zobrazit, a uložíme ji do pomocné proměnné path. Pokud je stránka volána bez parametrů, nastavuje se zde výchozí cesta, kterou je v tomto případě C:. Do další pomocné proměnné je uložena „čistá“ adresa stránky bez parametrů, kterou použijeme při vytváření URL odkazů:

var path = location.search;
if (path==““)
    path = „C:“;
else
    path = unescape(path.substring(1));
var strLoc = location.href;
var ii;
if( (ii=strLoc.indexOf(„?“)) != -1 ) strLoc=strLoc.slice(0,ii);

Tělo stránky obsahuje formulář, určený pro odeslání výsledků. Do jeho skrytého pole JavaScriptem doplníme aktuální cestu, tedy aktuální hodnotu proměnné path. Tuto hodnotu rovněž zobrazíme „přímo do stránky“. Celý kód (mix HTML a JavaScriptu) může mít třeba tuto podobu:

<form>
<p><b>Aktuální adresář:</b>
<script language=“JavaScript“>
<!———
    document.write(„<input type=’hidden‘ name=’path‘ value='“+path+“‚>“);
    document.write(path);
//——–>
</script>
&nbsp;&nbsp;&nbsp; <input type=“submit“ value=“Vybrat“ name=“s“>
</p>
</form>

Poslední částí kódu je výpis aktuální cesty a podadresářů. Nejprve vytvoříme pomocnou funkci WriteFolder, která dle zadaných parametrů vypisuje jeden řádek výstupu s obrázkem, částí adresářové cesty a odkazem:

function WriteFolder ( p, theUrl, theOffset, fOpen ) {
    for( j=0; j<theOffset; j++) document.write(„&nbsp;&nbsp;&nbsp;&nbsp;“);
    document.write( „<img src='“+(fOpen?“disktree_folderopen“:“disktree_folderclosed“)+“.gif‘> <a href='“+strLoc+“?“+escape(theUrl)+“‚>“ + p + „</a><br>“ );
}

Cestu k zobrazenému adresáři (je stále ještě uložena v proměnné path) v následující nevzhledné smyčce rozdělíme na jednotlivé části (oddělovačem jsou zpětná lomítka) a každou z nich vypíšeme na samostatný řádek s využitím funkce WriteFolder:

var ii, strActiveFolder;
var pp = path;
var xoff = 0;
var url = „“;
while( (ii=pp.indexOf(„\\“)) != -1 ) {
    strActiveFolder = pp.substring(0,ii);
    url += strActiveFolder;
    WriteFolder( strActiveFolder, url, xoff, true );
    url += „\\“;
    pp = pp.substring(ii+1);
    xoff++;
}
url += pp;
WriteFolder( pp, url, xoff, true );
xoff++;

Naposledy pak následuje výpis podadresářů aktuálního adresáře. Je to jediná – ač nejdůležitější – část celého kódu, v níž je využito technologie Windows Scripting Host, konkrétně ActiveX objektu FileSystemObject. Podmínka na třetím řádku ošetřuje správné zadání kořenového adresáře do metody GetFolder. Co se vlastně v následujícím kódu děje, je poměrně zřejmé z názvů použitých metod. Jedinou „zvláštností“ je snad použití objektu Enumerator. Tento objekt je v podstatě zprostředkovatelem, který umožňuje přístup k jednotlivým členům kolekce, v tomto případě kolekce podsložek Folders, vrácené metodou SubFolders. Microsoft sice v dokumentaci doporučuje stručnější přístup ke členům kolekce pomocí syntaxe for...in, ten však vykazoval při testech menší stabilitu a vyšší chybovost.

var fs, f, path2;
fs = new ActiveXObject(„Scripting.FileSystemObject“);
if( path.length == 2 ) path2 = path + „\\“; else path2 = path;
f = fs.GetFolder(path2);
var subfc = new Enumerator(f.SubFolders);
for(; !subfc.atEnd(); subfc.moveNext()) {
    WriteFolder( subfc.item().Name, path + „\\“ + subfc.item().Name , xoff, false );
}

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět