вторник, 16 июня 2009 г.

Переименование файла

Переименовать файл в DocsVision нужно в несколько этапов.
В карточке файла, в карточке файла с версиями и в каждой версии файла.

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

Ссылка на xml процесса и проект в VS2008

Задача переименования файлов в процессе часто встречается в проектах?
Как решаете?

3 комментария:

  1. Встречалась один раз. Но было очень надо :)
    Помог ваш сценарий на C#, который нам был выслан очень давно, большое спасибо!
    Если можно, приведу его тут:

    // подключение системных библиотек
    using System;
    using System.Xml;

    // подключение библиотек СУБП
    using DocsVision.Workflow.Objects;
    using DocsVision.Workflow.Runtime;
    using DocsVision.Workflow.Gates;
    using DocsVision.Platform.ObjectManager;

    namespace DVScriptHost
    {
    class DVScript
    {
    public void Execute(DocsVision.Workflow.Runtime.ProcessInfo process, PassState passInfo)
    {
    try
    {
    // переменная процесса - карточка файла (тип - файл DV)
    ProcessVariable oFile = process.GetVariableByName("Стратегический план_файл ");
    // переменная процесса - новое имя файла (строка)
    ProcessVariable oFileName = process.GetVariableByName("Название Стратегического плана_строка ");
    process.LogMessage("Получили переменные");
    // приводим тип
    DVFileCard dvFile = (DVFileCard)oFile.Value;
    process.LogMessage("Получили файл");
    // получаем шлюз
    DVGate oGate = (DVGate)process.Gates[DVGate.GateID];
    process.LogMessage("Получили шлюз");
    // получаем сессию
    UserSession oSession = oGate.Session;
    process.LogMessage("Получили сессию");
    // получаем данные карточки
    CardData oData = oSession.CardManager.get_CardData(dvFile.ID);
    process.LogMessage("Получили данные карточки файла");
    oData.Description = oFileName.Value.ToString();
    // получаем основную секцию
    SectionData oSection = oData.Sections["B4562DF8-AF19-4D0F-85CA-53A311354D39"];
    process.LogMessage("Получили секцию");
    // строка (в этой секции она всегда одна)
    RowData oRow = oSection.FirstRow;
    process.LogMessage("Получили строку");
    oRow.set_Value("FileName", oFileName.Value.ToString());
    // получаем идентификатор карточки файла с версиями (VersionedFileCard)
    string sVFCardID = oRow.get_Value("FileID").ToString();
    process.LogMessage("Идентификатор карточки файла с версиями: " + sVFCardID);
    // получаем системный объект - карточку файла с версиями
    VersionedFileCard oVFCard = (VersionedFileCard)oSession.CardManager.get_Card(sVFCardID);
    process.LogMessage("Получили системный объект - карточку файла с версиями");
    // у карточки файла с версиями, получаем текущую версию
    FileVersion oCurVer = oVFCard.CurrentVersion;
    process.LogMessage("Получили текущую версию");
    // переименовываем
    oCurVer.Name = oFileName.Value.ToString();
    oVFCard.Name = oFileName.Value.ToString();
    process.LogMessage("Файл переименован");
    IFile oRawFile = (IFile)oCurVer;
    oRawFile.Name = oFileName.Value.ToString();
    }
    catch (Exception ex)
    {
    // запись в журнал ошибки исполнения
    process.LogMessage("Ошибка выполнения скрипта: " + ex.Message);
    }
    return;
    }
    }
    }

    ОтветитьУдалить
  2. Да, алгоритм тот же, что и в нашем примере.
    В примере переименовываются все версии файла, а в этом коде только текущая, - видимо для решения задачи этого было достаточно...

    ОтветитьУдалить
  3. У нас задача переименования файлов встает в тот момент, когда создается очередной цикл согласования, а загружаемый документ имеет расширение, отличное от предыдущего (например, на 1 цикле был документ "Договор.doc", а на второй исполнитель прислал "Договор.pdf").
    Решили проблему, прикрутив свою софтину непосредственно к БД (правим dvsys_files).
    Dv 4.1.1640

    ОтветитьУдалить