Printing directory contents into MS Word table takes a long time

Viewed 32

I'm writing a JS script, which prints a sorted list of files in the specified directory into the MS Word table. It works fine for the most of directories, but my system32 folder contains about 3000 files and it takes a few minutes for my script to complete. I think that it is too much. Is there anyting I should optimize in my code?

var X,D,FSO,sortedFiles=[],knownExtensions=[],scriptArgs,unnamedArgs;
var registryReader=new ActiveXObject("WScript.Shell");
scriptArgs = WScript.Arguments;
unnamedArgs=scriptArgs.Unnamed; 
if(unnamedArgs.length!=2) WScript.Echo("Invalid arguments");
else {
    FSO = new ActiveXObject("Scripting.FileSystemObject");
    X=unnamedArgs(0); // path
    D=unnamedArgs(1); // document name
    if(!FSO.FolderExists(X)) {
        FSO.CreateFolder(X);
        WScript.Echo("Каталог не существует, создадим его");
    }
    if(FSO.FileExists(X+"\\"+D)) {
        WScript.Echo("Ошибка: документ уже существует");
    }
    else {
        getSortedFilesList();
        fillDocument();
    }
    
}

function fillDocument()
{
    var textEditor,textDocument,table,currentFileSize=0,totalSize=0,p;
    textEditor=new ActiveXObject("Word.Application");
    textEditor.ScreenUpdating = false;
    try{
        textDocument = textEditor.Documents.Add();
        textDocument.Paragraphs.Add();
        p=textDocument.Content;
        p.Text = "Файлы каталога \""+X+"\":\r\n";
        p.Paragraphs.Alignment = 1; //по центру
        p.Collapse(0);      
        table=textDocument.Tables.Add(p, sortedFiles.length+1, 4);
        table.Range.ParagraphFormat.Alignment=0; // по левому краю
        table.Borders.Enable = true;
        table.Cell(1,1).Range = "№";
        table.Cell(1,2).Range = "Название";
        table.Cell(1,3).Range = "Тип";
        table.Cell(1,4).Range = "Размер";
        for(var i=0; i<sortedFiles.length; i++)
        {
            table.Cell(i+2,1).Range = i+1;
            table.Cell(i+2,2).Range = sortedFiles[i].Name;
            table.Cell(i+2,3).Range = getExtensionInfo(getFileExtension(sortedFiles[i].Name));
            table.Cell(i+2,4).Range = sortedFiles[i].Size;
        }
        for(var i=2; i<=table.Rows.Count; i++)
        {
            currentFileSize=parseInt(table.Cell(i,4).Range);
            totalSize+=currentFileSize;
        }
        table.Rows.Add();
        table.Cell(table.Rows.Count,1).Merge(table.Cell(table.Rows.Count,3));
        table.Cell(table.Rows.Count,1).Range="Всего";
        table.Cell(table.Rows.Count,1).Range.ParagraphFormat.Alignment = 2; // по правому краю
        table.Cell(table.Rows.Count,2).Range=totalSize;
        table.Rows(1).HeadingFormat = true; // отображаем шапку на каждой странице документа
        p.Collapse(0);
        textDocument.SaveAs(X+"\\"+D);
    }
    catch(e){ WScript.Echo("При работе с документом произошла ошибка: "+e.description); }
    textEditor.ScreenUpdating = true;
    textEditor.Quit();
}

function getSortedFilesList()
{
    var currentFolder,myEnum;
    currentFolder=FSO.GetFolder(X);
    myEnum=new Enumerator(currentFolder.Files);
    while(!myEnum.atEnd()) {
        sortedFiles.push(myEnum.item());
        myEnum.moveNext();
    }
    sortedFiles.sort(mySort);
    return sortedFiles;
}

function mySort(a,b){
    if(a.Name.toLowerCase()==b.Name.toLowerCase()) return 0;
    if(a.Name.toLowerCase()<b.Name.toLowerCase()) return -1;
    else return 1;
}

function getExtensionInfo(ext){
    try {
        if(!(ext in knownExtensions)) {
            var defaultKey=registryReader.RegRead("HKCR\\"+ext+"\\");
            if(defaultKey=="") throw "empty_value";
            var extensionInfo=registryReader.RegRead("HKCR\\"+defaultKey+"\\");
            knownExtensions[ext]=extensionInfo+" ("+ext+")";
        }
    }
    catch(e)
    {
        WScript.Echo("Предупреждение: не удалось получить информацию о расширении:  "+ext);
        knownExtensions[ext]="Неизвестно ("+ext+")";
    }
    return knownExtensions[ext];
}

function getFileExtension(filename) {
    var index=filename.lastIndexOf(".");
    return filename.substr(index);
}
0 Answers
Related