...

Не освобождается место на диске при удалении файлов

Тема в разделе "Вопросы по CSP: ECM + СЭД + Решения", создана пользователем ELMA365, 28 апр 2026 в 18:12.

  1. ELMA365

    ELMA365 Moderator

    Рассмотрим ситуацию, когда файл удалён, но место на диске не освобождается, на примере скрипта:
    Код:
    
    async function test(): Promise<void> {
       const 
    test await Context.data.prilozhenie!.fetch()

       
    let file await test.fields.faily.createFromLink("text.bmp"'https://ссылка_на_файл');
       
    test.data.faily file
       await test
    .save();

       
    Context.data.file_ctx file;

    }
    При выполнении скрипта:

    1. С помощью метода createFromLink создаётся системный файл в хранилище S3. Одновременно с этим в PostgreSQL добавляется первая запись об этом файле.

    2. После создания системного файла устанавливается связь между файлом и приложением, в котором он хранится.

    3. При вызове test.save() в PostgreSQL создаётся вторая запись, в которой хранится связь между файлом и приложением. Эта запись содержит ссылку на первую запись, но не создаёт копию файла в хранилище S3.

    В результате в PostgreSQL остаются две записи, ссылающиеся на один и тот же файл в хранилище S3.

    Почему место на диске не освобождается

    Если удалить файл только из приложения, удаляется запись, привязанная к этому приложению. Запись, созданная через createFromLink, остаётся в системе.

    Итог: ссылка на тело файла в хранилище S3 сохраняется, поэтому место не освобождается.

    Решение проблемы
    Чтобы удалить файлы и освободить место на диске:

    1. Получите список файлов из приложений, которые планируете удалить.

    2. Для каждого удаляемого файла найдите все записи с таким же хешем.

    3. Удалите найденные файлы с помощью команды:
    Код:
    
    const filesForDelete await System.files.search()

       .
    where(=> f.hash.eq('<хеш_файла>'))

       .
    all();


    filesForDelete.forEach(async (f) => await f.delete());