Поделиться через


Функция SHFileOperationW (shellapi.h)

Копирует, перемещает, переименовывает или удаляет объект файловой системы. Эта функция была заменена в Windows Vista IFileOperation.

Синтаксис

int SHFileOperationW(
  [in, out] LPSHFILEOPSTRUCTW lpFileOp
);

Параметры

[in, out] lpFileOp

Тип: LPSHFILEOPSTRUCT

Указатель на структуру SHFILEOPSTRUCT, содержащую сведения, необходимые для выполнения указанной операции. Этот параметр должен содержать допустимое значение, которое не NULL. Вы несете ответственность за проверку значения. Если вы не проверяете его, вы получите непредвиденные результаты.

Возвращаемое значение

Тип: int

Возвращает ноль в случае успешного выполнения; в противном случае ненулевое значение. Приложения обычно должны просто проверять ноль или ненулевое значение.

Рекомендуется изучить значение fAnyOperationsAborted члена SHFILEOPSTRUCT. SHFileOperation может вернуть значение 0 для успешного выполнения, если пользователь отменяет операцию. Если вы не проверяете fAnyOperationsAborted, а также возвращаемое значение, вы не можете знать, что функция выполнила полную задачу, которую вы спросили об этом, и вы можете продолжить при неправильных предположениях.

Не используйте GetLastError с возвращаемыми значениями этой функции.

Чтобы изучить ненулевое значение для устранения неполадок, они в основном сопоставляются с значениями, определенными в Winerror.h. Однако несколько возможных возвращаемых значений основаны на кодах ошибок до Win32, которые в некоторых случаях перекрывают последующие значения Winerror.h без сопоставления их значения. Эти конкретные значения подробно описаны здесь, и для этих конкретных значений только эти значения должны приниматься над кодами Winerror.h. Однако эти значения предоставляются с этими предупреждениями:

  • Это коды ошибок до Win32 и больше не поддерживаются или не определены в любом общедоступном файле заголовка. Чтобы использовать их, необходимо определить их самостоятельно или сравнить с числовым значением.
  • Эти коды ошибок могут быть изменены и исторически сделали это.
  • Эти значения предоставляются только в качестве помощи в отладке. Они не должны рассматриваться как окончательные.
Код ошибки Ценность Значение
DE_SAMEFILE 0x71 Исходные и целевые файлы являются одинаковыми.
DE_MANYSRC1DEST 0x72 Несколько путей к файлам были указаны в исходном буфере, но только один путь к целевому файлу.
DE_DIFFDIR 0x73 Операция переименования была указана, но путь назначения — это другой каталог. Используйте вместо этого операцию перемещения.
DE_ROOTDIR 0x74 Источник является корневым каталогом, который нельзя переместить или переименовать.
DE_OPCANCELLED 0x75 Операция была отменена пользователем или автоматически отменена, если соответствующие флаги были предоставлены SHFileOperation.
DE_DESTSUBTREE 0x76 Назначение — это поддерев источника.
DE_ACCESSDENIEDSRC 0x78 Параметры безопасности отказано в доступе к источнику.
DE_PATHTOODEEP 0x79 Исходный или конечный путь превышен или превысит MAX_PATH.
DE_MANYDEST 0x7A Операция включала несколько путей назначения, которые могут завершиться ошибкой в случае операции перемещения.
DE_INVALIDFILES 0x7C Путь к источнику или назначению был недопустимым.
DE_DESTSAMETREE 0x7D Источник и назначение имеют одну и ту же родительскую папку.
DE_FLDDESTISFILE 0x7E Конечный путь — это существующий файл.
DE_FILEDESTISFLD 0x80 Путь назначения — это существующая папка.
DE_FILENAMETOOLONG 0x81 Имя файла превышает MAX_PATH.
DE_DEST_IS_CDROM 0x82 Назначение — это компакт-диск, доступный только для чтения, возможно, неформатирован.
DE_DEST_IS_DVD 0x83 Назначение — это DVD-диск, доступный только для чтения, возможно, неформатирован.
DE_DEST_IS_CDRECORD 0x84 Назначение — это записываемый компакт-диск, возможно, неформатирован.
DE_FILE_TOO_LARGE 0x85 Файл, участвующий в операции, слишком велик для целевого носителя или файловой системы.
DE_SRC_IS_CDROM 0x86 Источник — это компакт-диск, доступный только для чтения, возможно, неформатирован.
DE_SRC_IS_DVD 0x87 Источник — это DVD-диск, доступный только для чтения, возможно, неформатирован.
DE_SRC_IS_CDRECORD 0x88 Источник — это записываемый компакт-диск, возможно, неформатирован.
DE_ERROR_MAX 0xB7 MAX_PATH превышено во время операции.
0x402 Произошла неизвестная ошибка. Обычно это связано с недопустимым путем в исходном или целевом расположении. Эта ошибка не возникает в Windows Vista и более поздних версиях.
ERRORONDEST 0x10000 В назначении произошла неуказанная ошибка.
DE_ROOTDIR | ERRORONDEST 0x10074 Назначение является корневым каталогом и не может быть переименовано.

Замечания

С этой функцией следует использовать полные имена путей. Использование с относительными именами путей не является потокобезопасным.

За двумя исключениями нельзя использовать SHFileOperation для перемещения специальных папок с локального диска на удаленный компьютер, указав сетевой путь. Исключениями являются "Мои документы" (CSIDL_PERSONAL, CSIDL_DOCUMENTS) и папки "Мои рисунки" (CSIDL_MYPICTURES).

При использовании для удаления файла SHFileOperation окончательно удаляет файл, если только не задан флаг FOF_ALLOWUNDO в элементе fFlags структуры SHFILEOPSTRUCT, на которую указывает lpFileOpOp. Установка этого флага отправляет файл в корзину. Если вы хотите просто удалить файл и гарантировать, что он не помещается в корзину, используйте DeleteFile.

Если обработчик обратного вызова копирования предоставляется и зарегистрирован, SHFileOperation вызывает его, если только не задан флаг, например FOF_NOCONFIRMATION в fFlags член структуры, на который указывает lpFileOp. Дополнительные сведения о реализации обработчиков обратного вызова копирования см. в ICopyHook::CopyCallback.

Удаление файлов рекурсивно, если вы не задали флаг FOF_NORECURSION в lpFileOp.

подключение файлов

С помощью Windows 2000 или более поздней версии можно подключиться HTML-файл с папкой, содержащей связанные файлы, такие как изображения формата обмена графики (GIF) или таблицы стилей. Если подключение к файлам включено, при перемещении или копировании HTML-файла подключенная папка и все его файлы также перемещаются или копируются. И наоборот, при перемещении папки со связанными файлами HTML-файл также перемещается.

HTML-файл должен иметь расширение .htm или .html. Подключение к связанным файлам создается путем размещения папки, содержащей их в той же папке, что и HTML-файл. Имя папки, содержащей подключенные файлы, должно совпадать с именем HTML-файла, за которым следует "_files" или "files" (это учитывает регистр, например". Файлы" не работают). Ниже приведен пример.

  1. Создайте файл с именем Test.htm в каталоге C:\Files (C:\Files\Test.htm).
  2. Создайте папку с именем Test.files в каталоге C:\Files (C:\Files\Test.files).
  3. Заполните папку несколькими файлами. Любой файл, размещенный в этой папке, подключен к Test.htm.
  4. Переместите или скопируйте файл Test.htm в каталог C:\Files2.
  5. Обратите внимание, что каталог Test.files теперь находится в каталоге C:\Files2.

Подключение к файлу включено по умолчанию. Его можно отключить, добавив запись REG_DWORD NoFileFolderConnection, как показано ниже:

HKEY_CURRENT_USER
   Software
      Microsoft
         Windows
            CurrentVersion
               Explorer
                  NoFileFolderConnection

Если параметр NoFileFolderConnection задано значение 1, подключение к файлу отключается. Если значение равно нулю или отсутствует, подключение к файлу включено.

Чтобы переместить только указанные файлы и ни один из подключенных файлов, задайте флаг FOF_NO_CONNECTED_ELEMENTS в fFlags элемент структуры, на который указывает lpFileOp.

Обратите внимание, что использование папки с именем, например "MyFile_files", для определения подключения может быть недопустимо для локализованных версий Windows. Термин "files" может потребоваться заменить эквивалентным словом на локальном языке.

Заметка

Заголовок shellapi.h определяет SHFileOperation как псевдоним, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОДа. Сочетание использования псевдонима, нейтрального для кодирования, с кодом, не зависящим от кодирования, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в соглашениях о прототипах функций.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows XP [только классические приложения]
минимальный поддерживаемый сервер Windows 2000 Server [только классические приложения]
целевая платформа Виндоус
заголовка shellapi.h
библиотеки Shell32.lib
DLL Shell32.dll (версия 4.0 или более поздняя версия)
набор API ext-ms-win-shell-shell32-l1-2-1 (представлено в Windows 10 версии 10.0.10240)