MoveFileEx не работает должным образом? - PullRequest
2 голосов
/ 09 марта 2012

Я пробовал несколько способов заставить MoveFileEx работать с флагом DELAY_UNTIL_REBOOT безуспешно. Ключ FileRenameOperations в реестре также показывает, что метод не был выполнен должным образом. В чем может быть причина?

Я вызываю свою функцию MoveFileEx так:

MoveFileEx(localFile, oldFile, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);

Мой код WINAPI выглядит следующим образом:

[DllImport("kernel32.dll", EntryPoint = "MoveFileEx")]
internal static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags);

internal enum MoveFileFlags
{
    MOVEFILE_REPLACE_EXISTING = 1,
    MOVEFILE_COPY_ALLOWED = 2,
    MOVEFILE_DELAY_UNTIL_REBOOT = 4,
    MOVEFILE_WRITE_THROUGH = 8
}

Это приложение запускается под учетной записью администратора. Может ли это быть потому, что я использую 4 вместо 0x4 или это какая-то проблема с 64 битами? Спасибо!

РЕДАКТИРОВАТЬ: Операция возвращает ложь и код ошибки 3.

Ответы [ 2 ]

5 голосов
/ 09 марта 2012

Код ошибки 3: ERROR_PATH_NOT_FOUND. Кажется, вы допустили простую ошибку в именах файлов: один из каталогов в одном из имен файлов не существует.

В комментарии вы утверждаете, что неуспешный вызов имеет вид:

MoveFileEx(newFile, "", 4);

Это, безусловно, не удастся. То, что вы пытаетесь сделать, это передать NULL в качестве имени файла назначения, чтобы удалить файл. Но вы не передаете NULL, вы пропускаете пустую строку. Чтобы передать NULL нативному API, вызовите его так:

bool res = MoveFileEx(filename, null,
    MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);

Я хотел бы убедиться, что вы включили SetLastError = true в ваш пинвоук, чтобы вы могли диагностировать ошибки.

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern bool MoveFileEx(string lpExistingFileName, 
    string lpNewFileName, MoveFileFlags dwFlags);
0 голосов
/ 21 июля 2015

Ваш процесс должен быть запущен с правами администратора.

...