Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Функция SHFileOperation





Функция SHFileOperation из библиотеки Shell32.dll выполняет копирование, перемещение, переименование и удаление объектов файловой системы (папок и файлов). В процессе выполнения выводится стандартное окно Windows для отображения процесса, подобное показанному на рисунке:

Вот её прототип:

int SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);

Тип данных LPSHFILEOPSTRUCT - это указатель на структуру SHFILEOPSTRUCT:

typedef struct _SHFILEOPSTRUCT{ HWND hwnd; UINT wFunc; LPCSTR pFrom; LPCSTR pTo; FILEOP_FLAGS fFlags; BOOL fAnyOperationsAborted; LPVOID hNameMappings; LPCSTR lpszProgressTitle; } SHFILEOPSTRUCT, FAR *LPSHFILEOPSTRUCT;

Описание полей структуры SHFILEOPSTRUCT:

Поле Описание
hwnd Дескриптор родительского окна. Это может быть hWnd вашей формы или главного окна Visual FoxPro.
wFunc
Выполняемая операция. Может принимать одно из следующих значений:
  Выполняет перемещение файла.
  Копирует файлы.
  Удаляет файлы. Значение поля pTo игнорируется.
  Переименовывает файлы

 

pFrom Адрес строки, в которой перечислены один или большее количество наименований исходных файлов (возможно, с указанием путей). Если используется более одного наименования файла, то каждая последующая спецификация отделяется от предыдущей нулевым байтом. Строка должна завершаться двумя нулевыми байтами.
pTo Адрес строки, в которой указана конечная папка для перемещения (копирования) файлов.Строка должна завершаться двумя нулевыми байтами.
fFlags 16-ти разрядное целое. Конкатенация флагов, определяющих порядок выполнения операции.
fAnyOperationsAborted В поле записывается ноль, если пользователь прервал операцию, и отличное от нуля значение, если операция завершена успешно.
hNameMappings В приложениях на Visual FoxPro не используется. Должен быть равен нулю.
lpszProgressTitle В приложениях на Visual FoxPro не используется. Должен быть равен нулю.

Параметр fFlags определяется как конкатенация (сложение) значений, перечисленных ниже:

fFlags = 512
Если папка, в которую необходимо копировать файлы, не существует, выводится диалоговое окно с запросом о создание папки:

fFlags = 256
Отображает шкалу прогресса, но не показывает имена файлов

fFlags = 128
Операция выполняется только над файлами указанной папки, если для имени и типа файла указан шаблон (*.*). Над вложенными папками никаких действий не выполняется.

fFlags = 8
Если при копировании, перемещении или переименовании файл с указанным именем уже существует в папке-адресате, то он будет заменён без предупреждающего сообщения. Иначе - выводится диалог для подтверждения замены:

fFlags = 4
Операция выполняется, окно отображения процесса не выводится.

Объявление функции SHFileOperation в Visual FoxPro:

DECLARE Long SHFileOperation IN Shell32.dll String @ FileOperation

Функция возвращает ноль при успешном выполнении.

Структура FileOperation может быть сформирована в символьной переменной длиной 26 байт; если вы хотите отслеживать ситуацию, когда пользователь отказался от файловой операции в процессе её выполнения, то передавайте эту переменную по ссылке, так как вам в этом случае потребуется проанализировать значение поля fAnyOperationsAborted.

В следующем примере показан код функции FileOperation, которая выполняет файловые операции, используя возможности, предоставляемые функцией SHFileOperation. Функция возвращает.T. при успешном выполнении операции.

FUNCTION FileOperation LPARAMETER tcFrom, tcTo, tnOper * * tcFrom - спецификация исходных файлов * tcTo - спецификация результирующих файлов (папки) * tnOper - определяет тип операции. * tnOper=1 - переместить файлы * tnOper=2 - копировать файлы * tnOper=3 - удалить файлы * tnOper=4 - переименовать файл * LOCAL lcSHFO, lcFrom, lnLenFrom, lcTo, lnLenTo, hGlobalFrom, hGlobalTo LOCAL lnFlag, lnReturn DECLARE Long SHFileOperation IN Shell32.dll String @ DECLARE Long GlobalAlloc IN WIN32API Long, Long DECLARE Long GlobalFree IN WIN32API Long * Начинаем формировать структуру в переменной lcSHFO lcSHFO = BINTOC(thisform.HWnd, '4RS') && Поле hwnd lcSHFO = lcSHFO + BINTOC(tnOper, '4RS') && Поле wFunc - вид операции * Обработка спецификации исходных файлов tcFrom = tcFrom + CHR(0) + CHR(0) && Дописываем нули lnLenFrom = LEN(tcFrom) && Длина исходной строки hGlobalFrom = GlobalAlloc(0x0040, lnLenFrom) && Выделяем для неё блок памяти SYS(2600, hGlobalFrom, lnLenFrom, tcFrom) && и копируем туда строку lcSHFO = lcSHFO + BINTOC(hGlobalFrom, '4RS') && Поле pFrom * Обработка спецификайии результирующих файлов IF tnOper = 3 lcSHFO = lcSHFO + BINTOC(0, '4RS') && для операции удаления ELSE tcTo = tcTo + CHR(0) + CHR(0) && Дописываем нули lnLenTo = LEN(tcTo) && Длина результирующей строки hGlobalTo = GlobalAlloc(0x0040, lnLenTo) && Выделяем для неё блок памяти SYS(2600, hGlobalFrom, lnLenFrom, tcFrom) && и копируем туда строку lcSHFO = lcSHFO + BINTOC(hGlobalTo, '4RS') && Поле pTo ENDIF lnFlag = 8 + 256 lcSHFO = lcSHFO + BINTOC(lnFlag, '2RS') && Поле fFlags lcSHFO = lcSHFO + REPLICATE(CHR(0), 12) && Последние 3 поля структуры * Выполняем операцию lnReturn = SHFileOperation(@lcSHFO) * Чистим память GlobalFree(hGlobalFrom) IF tnOper!= 3 GlobalFree(hGlobalTo) ENDIF * Если lnReturn = 0, то операция завершена успешно IF lnReturn!= 0 RETURN.f. ENDIF RETURN.t. ENDFUNC

Проанализируем код.

Структура SHFILEOPSTRUCT для функции SHFileOperation формируется в переменной lcSHFO. Записываем в первые четыре байта переменной значение hwnd, в следующие 4 байта - значение wFunc, определяющее характер операции. Поля pFrom и pTo содержат указатели на строки, содержащие информацию о спецификациях исходных и конечных файлов. Каждая такая строка должна заканчиваться двумя нулевыми байтами. Такой вид окончания строки используется потому, что при задании спецификации, например, исходных файлов, могут быть заданы файлы, расположенные в различных папках. В этом случае спецификации этих файлов разделяются одиночным нулевым байтом. Например:

cFiles = 'c:\Foder1\File1.typ' + CHR(0) + 'd:\Folder2\File2.typ' + CHR(0) + CHR(0)

Выделяем блок в глобальной памяти Windows и получаем указатель на него:

hGlobalFrom = GlobalAlloc(0x0040, lnLenFrom)

Переписываем в выделенный блок памяти значение строки спецификации файла:

SYS(2600, hGlobalFrom, lnLenFrom, tcFrom)

Помещаем полученный указатель в поле структуры. Для преобразования целочисленного значения указателя в строку используем функцию BINTOC:

lcSHFO = lcSHFO + BINTOC(hGlobalFrom, '4RS')

Аналогичные действия выполняем и для получения указателя на строку, содержащую спецификацию конечных файлов - если код операции не удаление файлов. Для операции удаления вместо указателя помещаем в структуру ноль.

Далее формируем значение флага fFlags и добавляем его в структуру. Обратите внимание, что поле для хранения флага - двухбайтовое:

lnFlag = 8 + 256 lcSHFO = lcSHFO + BINTOC(lnFlag, '2RS')

Указанные значения флага определяют, что функция будет запрашивать необходимость создания новой папки и не будет запрашивать необходимость замены при одинаковых именах и типах исходных и конечных файлов.

Дописываем в переменную lcSHFO 12 нулевых байтов - это поля структуры fAnyOperationsAborted, hNameMappings и lpszProgressTitle.

После выполнения файловой операции возвращаем Windows память, выделенную функциями GlobalAlloc:

GlobalFree(hGlobalFrom)

Вы можете проверить содержимое поля fAnyOperationsAborted, которое после успешного выполнения функции будет содержать ноль либо отличное от нуля значение, если операция была прервана пользователем. Вот этот код:

IF CTOBIN(SUBSTR(lcSHFO, 19, 4), '4N')!= 0 * Код, выполняющийся, если операция прервана пользователем ENDIF

При написании раздела мною не ставилась цель дать информацию о всех Windows API функциях, которые вы могли бы применять в ваших приложениях. Главная цель - объяснить, как, пользуясь описанием любой такой функции в MSDN, правильно её объявить в Visual FoxPro и, самое главное, правильно использовать. В следующих разделах этого руководства постоянно будут применяться различные Windows API функции, но уже без такого подробного объяснения, как здесь.

Date: 2015-07-27; view: 1341; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию