var scriptName = 'WatchFolderForCollection'; var scriptVersion = '2025-06-01'; function OnInit(initData) { initData.name = scriptName; initData.version = scriptVersion; initData.url = 'https://resource.dopus.com/t/how-to-dynamically-update-a-file-collection-when-new-files-are-added-to-a-folder/55902'; initData.desc = 'WatchFolderForCollection'; initData.default_enable = true; initData.min_version = '13.0'; } function OnAddCommands(addCmdData) { var cmd = addCmdData.AddCommand(); cmd.name = 'WatchFolderForCollectionStart'; cmd.method = 'OnWatchFolderForCollectionStart'; cmd.desc = 'WatchFolderForCollectionStart'; cmd.label = 'WatchFolderForCollectionStart'; cmd.template = ''; cmd.hide = false; cmd.icon = 'script'; var cmd = addCmdData.AddCommand(); cmd.name = 'WatchFolderForCollectionStop'; cmd.method = 'OnWatchFolderForCollectionStop'; cmd.desc = 'WatchFolderForCollectionStop'; cmd.label = 'WatchFolderForCollectionStop'; cmd.template = ''; cmd.hide = false; cmd.icon = 'script'; } function OnWatchFolderForCollectionStart(scriptCmdData) { var folderWatchConfig = {}; var idCounter = 1; AddFolder('L:\\Folder1', 'coll://WatchedFolderCollection1'); // Non-recursive (default) AddFolder('L:\\Folder2', 'coll://WatchedFolderCollection2', true); // Recursive AddFolder('L:\\Folder3', 'coll://WatchedFolderCollection3', true); // Recursive function AddFolder(folderPath, targetCollection, isRecursive) { var watchID = scriptName + 'folderWatch' + idCounter++; folderWatchConfig[watchID] = { folder: folderPath, collection: targetCollection, recursive: !!isRecursive }; } var cmd = scriptCmdData.func.command; var fsu = DOpus.FSUtil(); var tabGroups = DOpus.tabgroups; // var tgName = 'WatchFolderForCollection'; var tgName = scriptName; for (var e = new Enumerator(tabGroups); !e.atEnd(); e.moveNext()) { var item = e.item(); if (item.name != tgName) continue; tabGroups.DeleteChild(item); } var newGroup = tabGroups.AddChildGroup(tgName); newGroup.desc = 'created by WatchFolderForCollection script'; newGroup.dual = true; newGroup.closeexisting = true; var infoTip = ''; for (var id in folderWatchConfig) { var item = folderWatchConfig[id]; var folder = item.folder; var collection = item.collection; var recursive = item.recursive; var watchFlags = recursive ? 'fr' : 'f'; var readFlags = recursive ? 'r' : ''; if (infoTip) infoTip += '\n'; infoTip += folder + ' -> ' + collection + (recursive ? ' (recursive)' : ''); cmd.RunCommand('CreateFolder' + ' NAME="' + folder + '"' + ' NAME="' + collection + '"'); fsu.WatchChanges(id, folder, watchFlags); Script.vars.Set('ssi' + id, DOpus.Create().StringSetI(fsu.ReadDir(folder, readFlags).Next(-1))); var newLeftEntry = newGroup.lefttabs.AddTab(folder); var newRightEntry = newGroup.righttabs.AddTab(collection); newGroup.Link(newLeftEntry, newRightEntry); } tabGroups.Save(); Script.vars.Set('folderWatchConfig', folderWatchConfig); DOpus.vars.Set('WatchFolderForCollection', 'on'); DOpus.vars.Set('WatchFolderForCollectionDescription', infoTip); } function OnWatchFolderForCollectionStop(scriptCmdData) { for (var id in folderWatchConfig) { fsu.CancelWatchChanges(id); } DOpus.vars.Delete('WatchFolderForCollection'); DOpus.vars.Delete('WatchFolderForCollectionDescription'); } function OnFilesystemChange(FilesystemChangeData) { var id = FilesystemChangeData.id; if (id.substring(0, scriptName.length) != scriptName) return; var folderWatchConfig = Script.vars.Get('folderWatchConfig'); var item = folderWatchConfig[id]; if (!item) return; var cmd = DOpus.Create().Command(); var ssi = Script.vars.Get('ssi' + id); var folder = item.folder; var collection = item.collection; var recursive = item.recursive; var readFlags = recursive ? 'r' : ''; cmd.ClearFiles(); var folderEnum = fsu.ReadDir(folder, readFlags); while (!folderEnum.complete) { var folderItem = folderEnum.Next(); if (!ssi.insert(folderItem)) continue; cmd.AddFile(folderItem); } folderEnum.Close(); cmd.SetDest(collection); cmd.RunCommand('Copy' + ' COPYTOCOLL=member' + ' WHENEXISTS=skip'); Script.vars.Set('ssi' + id, DOpus.Create().StringSetI(fsu.ReadDir(folder, readFlags).Next(-1))); } // DOpus.Output('WatchFolderForCollection script started.'); // DOpus.Output('WatchFolderForCollection script initialized'); // DOpus.Output('folderWatchConfig.length: ' + folderWatchConfig.length);