2012-03-08 6 views
2

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

Звоню функцию 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-битной? Благодаря!

EDIT: Операция возвращает ложное и код ошибки из 3.

+1

Ну, '4 == 0x4'. Этот pinvoke будет интерпретироваться одинаково на x64 и x86. Вы подразумеваете, что ваш код работает отлично как 32-битный процесс? Как выглядит вызов MoveFileEx? –

+0

от Microsoft, код C++ это: 'BOOL WINAPI MoveFileEx ( __in LPCTSTR lpExistingFileName, __in_opt LPCTSTR lpNewFileName, __in DWORD dwFlags );' –

+4

Это не вызов. Это декларация, и мы уже знаем эту часть, потому что она находится в MSDN. Вам нужно показать * ваш * код, пожалуйста. –

ответ

5

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

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

MoveFileEx(newFile, "", 4); 

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

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

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

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] 
internal static extern bool MoveFileEx(string lpExistingFileName, 
    string lpNewFileName, MoveFileFlags dwFlags); 
+0

Я дважды проверил это, это не проблема. Я даже копировал и вставлял в окно запуска только сейчас, и он выполнялся. –

+0

На данный момент мы не можем много помочь. Windows говорит одно, вы говорите что-то еще. Ясно, что один из вас ошибается, но я не думаю, что мы можем сделать гораздо больше. –

+0

Я чувствую, что мой компьютер только что совершил преступление и отправил меня в тюрьму за это! –

0

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

Смежные вопросы