[ID CC-CC2022] поиск файлов по маске

  • Автор темы Автор темы Sergio_MC
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Sergio_MC

Участник
Топикстартер
Сообщения
6
Реакции
0
Здравствуйте! Подскажите, как можно найти файлы в папке по маске
Пробовал через
Код:
myFiles = Folder(myFolder).getFiles(mask);
но файлов много и сия конструкция работает очень долго.
Нашел код на VBS который делает это практически мгновенно
Код:
Set objShell = CreateObject("Shell.Application")
Set objFolderItems = objShell.NameSpace(myFolder).Items
objFolderItems.Filter 64 + 128, "*" & mask & "*"
For Each myFiles in objFolderItems
    MsgBox myFiles.Name
Next

Можно ли написать аналог на JS?
Ну ли как-то через doScript подключить кусочек VBS?

Как это это сделать самому разобрался не удалось.
Вернее как передать mask и myFolder примерно понятно:
Код:
var myParam = [mask, myFolder];
app.doScript (myScript, ScriptLanguage.visualBasic, myParam);

А вот как вернуть результат работы VBS обратно в JS - не осилил.
 
Так курите документацию
getFiles()
folderObj.getFiles ([mask])
mask Optional. A search mask for file names. A string that can contain question mark (?) and
asterisk (*) wild cards. Default is "*", which matches all file names.
Can also be the name of a function that takes a File or Folder object as its argument.
It is called for each file or folder found in the search; if it returns true, the object is added
to the return array.
NOTE: In Windows, all aliases end with the extension .lnk; ExtendScript strips this from
the file name when found, in order to preserve compatibility with other operating
systems. You can search for all aliases by supplying the search mask "*.lnk", but note
that such code is not portable.
Retrieves the contents of this folder, filtered by the supplied mask.
Returns an array of File and Folder objects, or null if this object’s referenced folder does not exist.
 
Честно говоря, ни разу не сталкивался с каким-то ощутимым замедлением. При этом, я обычно использую не маску, а функцию проверки - условно вот так

Код:
var allFiles = myFolder.getFiles(isMyFile);

function isMyFile(obj)
{
if(obj.constructor.name=="File" && obj.name.indexOf("myMask")!=-1) return true;
return false;
}
 
что касается doScript(), она возвращает последнее выражение (точнее, statement) из вызываемого скрипта

например
Код:
var a = app.doScript("100",ScriptLanguage.JAVASCRIPT);

после выполнения этого в a будет 100
 
Последнее редактирование:
Спасибо за советы.
Попробовал через getFiles с функцией. Все равно, для 10000 файлов на сетевом диске поиск двух файлов занимает около минуты =(
Покурил гугль и выстрадал вот такой, вроде рабочий вариант:
Код:
var myDoc = app.activeDocument;
var mySel = myDoc.selection[0]; //выделяем картинку
if (mySel.allGraphics.length > 0) {
    var myPicName = mySel.allGraphics[0].itemLink.name;
    var myPicPath = mySel.allGraphics[0].itemLink.filePath.replace(myPicName, "");
}
// вычисляем ID картинки
var regexp = /[0-9]{4,}/; 
myFinds = regexp.exec(myPicName);
if (myFinds != null) {
   myFinds = myFinds[0];
} else {
   alert("не найден ID");
}

//ищем в папке картинки с таким же ID
var myVariable = [myPicPath, myFinds];
var myVBScript = 'Set myID = CreateObject("InDesign.Application")\r';
myVBScript += 'Set objShell = CreateObject("Shell.Application")\r';
myVBScript += 'Set objFolderItems = objShell.NameSpace(arguments(0)).Items\r';
myVBScript += 'objFolderItems.Filter 64 + 128, "*" & arguments(1) & "*"\r';
myVBScript += 'For Each myFiles in objFolderItems\r';
myVBScript += 'out = out & "|" & myFiles.Path\r'; 
myVBScript += 'Next\r';
myVBScript += 'myID.ScriptArgs.SetValue "vResult", out\r';

app.doScript(myVBScript, ScriptLanguage.visualBasic, myVariable); 
var myV = app.scriptArgs.getValue("vResult");
var myFiles = myV.split("|");
for (a in myFiles) {
 alert(myFiles[a]);
}

Поиск двух файлов - 2 сек.
Буду благодарен если предложите более правильный вариант, а то преобразование массива в строку, а потом обратно в массив мне кажется не комильфо.
 
двух? а зачем их тогда искать, полагаю, можно целиком имя просто прописать, разве нет?

преобразование массива в строку, а потом обратно в массив мне кажется не комильфо.

самое то
 
просто в тестовом режиме использовал 2 файла, а так количество совпадений, по ощущениям, на время поиска не влияет.
 
Статус
Закрыто для дальнейших ответов.