relink to folder через скрипт

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

Sergio_MC

Участник
Топикстартер
Сообщения
6
Реакции
0
Приветствую! Подскажите, как воспользоваться индизайновской функцией "relink to folder" (связать заново с папкой) в скрипте. Нужно перелинковать 300-400 фото в каталоге, но проблема в том, что фото находятся в разных папках.
Папки довольно объемные. Вот такая конструкция только собирает файлы около 2 минут:
Код:
myFolder.getFiles();
А по ним еще нужно пройтись поиском и перелинковать.
Пробовал создавать сторонней программой индексный txt файл (получилось около 100000 строк) и вот таким скриптом перелинковывать:
Код:
var myDoc = app.activeDocument;
var myLinks = myDoc.links;
var txtArr = read_txt_arr(openTxtFile());
 
for (j=0; myLinks.length>j; j++) {
    compareLinks(myLinks[j]);
}  
 
alert("Done");
 
 
//==========FUNCTIONS===================================
 
function compareLinks (srchString) {
    for (var i=0; txtArr.length>i; i++) {
        //if (txtArr[i].indexOf (srchString.filePath); > -1);
             if ((txtArr[i].indexOf (srchString.name) > -1) && (txtArr[i].indexOf (srchString.filePath) != 0)) {
                 myLinks[j].relink(File(txtArr[i]));
             } 
    }  
}
 
function openTxtFile() {
    defaultFile = new File (app.activeDocument.filePath+"_.txt");
    if (File.fs == "Windows") {
       return defaultFile.openDlg( 'Open Links File', "Plain text file:*.txt" );
    } else {
       return defaultFile.openDlg( 'Open Links File');
    } 
}  
 
//читаем txt файл в массив txtArr
function read_txt_arr (lnkFile) {
    var arr = [];  
    var f = File (lnkFile);
    if (f.exists) {
        f.open ("r");
        while(!f.eof) {
            arr.push(f.readln());
        }
       return arr      
        f.close ();
    } else {
       return ""
    }
}
Однако и такой способ работает очень долго.
А вот "relink to folder", справляется с этой задачей за 30-40 секунд. Как. Как он это делает?
 
Код:
TO_FOLDER_PATH = Folder.selectDialog().absoluteURI;
LINKS = app.documents[0].links;
for (i=0; LINKS.length>i; i++) {
to_file = new File( TO_FOLDER_PATH + '/' + new File(LINKS[i].filePath).displayName );
if( to_file.exists )
LINKS[i].relink( to_file );
}
 
  • Спасибо
Реакции: Sergio_MC
Спасибо тебе добрый человек! Так гораздо быстрее. Запихнул свой список папочек в массив и добавил цикл по нему. Теперь перелинковка занимает чуть больше минуты.
 
Как добавить в этот скрипт подпапку?
Комментарий модератора: @depp , я так понимаю, это вопрос, а не заголовок к неопубликованной статье? Предлагаю впредь проявлять уважение к участникам форума, у которых Вы просите помощи, и добавлять необходимые знаки препинания к Вашим сообщениям, чтобы Вас легче было понять.
 
Последнее редактирование модератором:
Как в этот скрипт нужно добавить путь не только к Folder а и к SubFolders тоже

TO_FOLDER_PATH = Folder.selectDialog().absoluteURI;
LINKS = app.documents[0].links;
for (i=0; LINKS.length>i; i++) {
to_file = new File( TO_FOLDER_PATH + '/' + new File(LINKS.filePath).displayName );
if( to_file.exists )
LINKS.relink( to_file );
}
 
Я для перебора подпапок пользуюсь вот такой функцией:

Код:
function GetSubFolders(theFolder) { 
     var myFileList = theFolder.getFiles(); 
     for (var i = 0; i < myFileList.length; i++) { 
          var myFile = myFileList[i]; 
          if (myFile instanceof Folder){ 
               GetSubFolders(myFile); 
          } 
          else if (myFile instanceof File && myFile.name.match(/\.indd$/i)) {  //если файл с расширением indd
               var myDocument = app.open(myFile, false); //то открываем файл
               // тут делаем что-то с файлом
               myDocument.close(SaveOptions.YES); //и закрываем
         } 
     } 
}
 
Что то не получается перебора подпапок
 
Если имена уникальные(не повторяющиеся), то мы без скрипта делаем. Оно как-то само встает.
 
Со скриптом интереснее
 
Статус
Закрыто для дальнейших ответов.