Файлові операції засобами shellapi


Файлові операції засобами ShellAPI.

Файлові операції засобами ShellAPI.

hNameMappings
Дескриптор об'єкта відображення імені файлу, який містить масив структур SHNAMEMAPPING. Кожна структура містить старі і нові імена шляху для кожного файлу, який переміщувався, скопійований, або перейменований. Цей елемент використовується тільки, якщо встановлено прапор FOF_WANTMAPPINGHANDLE.

lpszProgressTitle
Покажчик на рядок, що використовується як заголовок для діалогового вікна прогресу. Цей елемент використовується тільки, якщо встановлено прапор FOF_SIMPLEPROGRESS.

Примітка.
Якщо pFrom або pTo не вказані, беруться файли з поточної директорії. Поточну директорію можна встановити за допомогою функції SetCurrentDirectory і отримати функцією GetCurrentDirectory.

А тепер - приклади.

Зрозуміло, вам потрібно вставити в секцію uses модуль ShellAPI. в якому визначена функція SHFileOperation.

Розглянемо найпростіше - видалення файлів.

Зверніть увагу, що жоден з прапорів не встановлено. Якщо ви хочете не просто видалити файли, а перемістити їх в корзину, повинен бути встановлений прапор FOF_ALLOWUNDO.

Для зручності подальших експериментів напишемо функцію, яка створює з масиву рядків буфер для передачі його в якості параметра pFrom. Після кожного рядка в буфер вставляється нульовий байт, в кінці списку - два нульових байта. Виглядає жахливо, але працює. Можна написати красивіше, просто лінь.

І, нарешті, функція, що видаляє файли, передані їй в списку Names. Параметр ToRecycle визначає, чи будуть файли переміщені в кошик або видалені. Функція повертає 0, якщо операція виконана успішно, і нульове значення, якщо руки у кого-то ростуть не з того місця, і цей хтось всунув функції імена неіснуючих файлів. Зверніть увагу, що ми звільняємо буфер Src простим привласненням значення nil. Якщо вірити документації, втрати пам'яті при цьому не відбувається, а навпаки, відбувається коректне знищення динамічного масиву. Яким чином, правда - це рак мозку :-).

Перевіряємо. Начебто все працює.

До речі, виявився цікавий глюк - викличемо процедуру DeleteFiles таким чином: Файли 'Test1' і 'Test2' видаляються зовсім, без приміщення в кошик, не дивлячись на встановлений прапор FOF_ALLOWUNDO. Мораль: при використанні функції SHFileOperation використовуйте повні шляху завжди, коли це можливо.
Ну, з видаленням файлів розібралися.

Наступна функція переміщує файли зазначені в списку Src в директорію Dest. Параметр Move визначає, чи будуть файли переміщатися або копіюватися. Параметр AutoRename вказує, перейменовувати чи файли в разі конфлікту імен. Ну, перевіримо. Все в порядку (а куди ж воно подінеться).

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

Залишилася остання операція - перейменування.

Поки все.
Mодуль FileOp.pas (3K) додається.