Функция MoveFileEx

Функция MoveFileEx перемещает существующий файл или каталог.

Функция MoveFileWithProgress эквивалентна функции MoveFileEx, за исключением того, что MoveFileWithProgress дает возможность предоставить функцию повторного вызова, которая получает уведомления о ходе выполнения.

Синтаксис

BOOL MoveFileEx(
  LPCTSTR lpExistingFileName,  // имя файла
  LPCTSTR lpNewFileName,       // имя нового файла
  DWORD dwFlags                // параметры перемещения
);

Параметры

lpExistingFileName

[in] Указатель на символьную строку с нулем в конце, которая именует существующий файл или каталог на локальном компьютере.

Если dwFlags устанавливает MOVEFILE_DELAY_UNTIL_REBOOT, то файл не может существовать при удаленном совместном использовании, потому что отложенные операции выполняются прежде, чем сеть будет доступна.

В версии ANSI этой функции, имя ограничивается числом символов флажка MAX_PATH. Чтобы выйти за пределы этого ограничения, до длины 32 767 символов, вызовите Unicode версию этой функции и присоедините спереди пути "\\?\". Подробную информацию см. в статье Именование файлов.

Windows 2000: Если вы присоединяйте спереди имени файла "\\?\", вы не можете также определить и флажок MOVEFILE_DELAY_UNTIL_REBOOT для параметра dwFlags.

lpNewFileName

[in] Указатель на символьную строку с нулем в конце, которая задает новое название lpExistingFileName на локальной машине.

При перемещении файла, место назначения может быть другой файловой системой или томом. Если приемник является другим диском, Вы в параметре dwFlags должны установить флажок MOVEFILE_COPY_ALLOWED.

При перемещении каталога, место назначения должно быть тем же самым диском.

Если параметр dwFlags устанавливает MOVEFILE_DELAY_UNTIL_REBOOT, параметр lpNewFileName - ПУСТО (NULL), функция MoveFileEx регистрирует  файл параметра lpExistingFileName для удаления, когда система перезагружается. Если параметр lpExistingFileName относится к каталогу, система удаляет при перезагрузке каталог, только в том случае, если каталог пуст.

dwFlags

[in] Этот параметр может состоять из одного или нескольких нижеследующих значений.
Значение Преднаначение
MOVEFILE_COPY_ALLOWED Если файл должен переместиться в другой том, функция имитирует перемещение, используя функции CopyFile и DeleteFile.

Это значение не может  использоваться с флажком MOVEFILE_DELAY_UNTIL_REBOOT.

MOVEFILE_CREATE_HARDLINK Зарезервированный для будущего использования.
MOVEFILE_DELAY_UNTIL_REBOOT Система не перемещает файл до тех пор, пока операционная система не перезапустится. Система перемещает файл, немедленно после того, как исполнено AUTOCHK, но перед созданием любого файла подкачки . Следовательно, этот параметр включает в работу функцию, которая удаляет  файл подкачки из предыдущих запусков.

Это значение может использоваться только в том случае, если процесс находится в контексте пользователя, который принадлежит группе администратора или учетной записи LocalSystem.

Это значение не может  использоваться с флажком MOVEFILE_COPY_ALLOWED.

Windows 2000: Если вы  определили флажок MOVEFILE_DELAY_UNTIL_REBOOT для параметра dwFlags, то вы не можете также и присоединить спереди имени файла "\\?\", определяемый параметром lpExistingFileName.

MOVEFILE_FAIL_IF_NOT_TRACKABLE Windows 2000/XP: Функция завершается ошибкой, если исходный файл является источником ссылки, но файл не может быть отслежен после перемещения. Эта ситуация может произойти тогда, когда место назначения является томом, отформатированным файловой системой FAT.

Windows NT: Это значение не поддерживается.

MOVEFILE_REPLACE_EXISTING Если файл, именованный  параметром lpNewFileName существует, функция заменяет его содержание содержанием файла в параметре lpExistingFileName.

Это значение не может использоваться, если lpNewFileName или lpExistingFileName именуют каталог.

MOVEFILE_WRITE_THROUGH Функция не возвращает значения до тех пор, пока файл не будет действительно перемещен на диск.

Настройки этого значения гарантирует, что перемещение, выполненное как копирование и операция удаления сбрасывается на диск, до того как функция возвращает значение. Сброс происходит в конце операции копирования.

Это значение не действует, если установлен флажок MOVEFILE_DELAY_UNTIL_REBOOT.

 

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

Если функция завершается успешно, возвращаемое значение - не нуль.

Если функция завершается ошибкой, величина возвращаемого значения - нуль. Чтобы получить дополнительные сведения об ошибке, вызовите GetLastError.

Замечания

Если параметр dwFlags  устанавливает флажок MOVEFILE_DELAY_UNTIL_REBOOT, MoveFileEx завершается ошибкой, если она не может получить доступ к реестру. Функция MoveFileEx сохраняет места файлов, которые переименуются при перезагрузке, в следующее ниже реестровое значение:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

Функция завершается ошибкой, если она не может обратиться к системному реестру.

Это значение реестра имеет тип REG_MULTI_SZ. Каждая операция переименования сохраняет следующую пару символьных строк с нулем в конце. 

szDstFile\0\0
szSrcFile\0szDstFile\0\0

Система использует эти записи системного реестра, чтобы завершать операции при перезагрузке в том же самом порядке, в котором они были созданы. Например, нижеследующий кодовый фрагмент создает записи системного реестра, которые удаляют szDstFile и переименовывают szSrcFile, чтобы при перезагрузке быть szDstFile :

MoveFileEx(szDstFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
MoveFileEx(szSrcFile, szDstFile, MOVEFILE_DELAY_UNTIL_REBOOT);

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

Система удаляет каталог, отмеченный для удаления флажком MOVEFILE_DELAY_UNTIL_REBOOT, только в том случае, если он пустой. Чтобы гарантировать удаление каталогов, переместите или удалите все файлы из каталога до того как  попытаетесь его  удалить. Файлы могут находиться в каталоге в период загрузки, но они должны быть удалены  или перемещены, до того как систем, может удалить этот каталог.

Операции перемещения и  удаления выполняются в момент загрузки в одном и том же порядке, в котором они определены в вызывающей программе. Чтобы удалить каталог, который имеет файлы в этот в период загрузки, сначала удалите эти файлы.

Если файл перемещается, из тома в том, MoveFileEx не перемещают дескриптор безопасности с файлом. Файлу должен быть назначен заданный по умолчанию дескриптор безопасности в принимающем каталоге.

Windows 2000/XP: Функция MoveFileEx координирует свою операцию со службой отслеживания связей, так что источники ссылок, когда они перемещаются, могут быть отслежены.

Windows 95/98/Me: Функция MoveFileEx не поддерживается. Чтобы переименовать или удалить файл при перезагрузке, используйте нижеследующую процедуру.

Чтобы переименовать или удалить файлы в Windows 95/98/Me

  1. Проверьте существование файла WININIT.INI  в каталоге Windows.
  2. Если WININIT.INI существует, откройте его и добавьте новые записи в существующий раздел [rename] . Если файл не существует, создайте этот файл и создайте раздел [rename].
  3. Добавьте строки нижеследующего формата в раздел [rename]:

    DestinationFileName=SourceFileName

    И параметр DestinationFileName и параметр SourceFileName должны иметь короткие имена файла. Чтобы удалить файл, используйте NULL (ПУСТО) как значение для DestinationFileName.

Система обрабатывает WININIT.INI в течение системной начальной загрузки. После того как файл WININIT.INI будет обработан, система называет его WININIT.BAK.

Чтобы удалить или переименовать файл, Вы должны иметь или разрешение на удаление файла, или разрешение на удаление потомка  в родительском каталоге. Если Вы устанавливаете каталог с полным доступом кроме удаления его и удаления его дочерних элементов, а списки контроля доступа (ACL) новых файлов унаследованы, то вам следует получить возможность создать файл, без возможности удалить его. Однако, Вы можете затем создать файл и  получить весь доступ, который Вы запрашиваете на дескрипторе, возвращенном Вам, когда Вы создаете файл. Если Вы затребовали разрешение на удаление, во время создания файла, Вы можете удалить или переименовать файл с этим дескриптором, но не с каким-либо другим.

Код примера

Пример смотри в статье Создание и использование временных файлов.

Смотри также 

Обзор Управление файламиФункции, используемые в управлении файлами, CopyFile, DeleteFile, GetWindowsDirectory , MoveFileWithProgress, WritePrivateProfileString

Размещение и совместимость MoveFileEx

К

Windows XP

Да 

л

Windows 2000 Professional

Да

и

Windows NT Workstation

Да

е

Windows Me

Нет

н

Windows 98

Нет

т

Windows 95

Нет

 
С

Windows Server 2003

Да

е Windows 2000 Server Да
р Windows NT Server Да
в    
е    
р    

Используемая библиотека

Kernel32.lib

Используемая DLL -
 Заголовочный файл  

- объявлено в

Winbase.h

 - включено в

Windows.h

 Unicode

Реализуется как версии Unicode и  ANSI для Windows 2000/XP. 

 Замечания по платформе

Не имеется

 

Назад в оглавление
На главную страницу
На оглавление справки

Hosted by uCoz