MoveFileWithProgress вызывает «Система не может переместить файл на другой диск» - почему? - PullRequest
2 голосов
/ 23 декабря 2011

У меня есть:

[SuppressUnmanagedCodeSecurity]
[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool MoveFileWithProgress(
    string lpExistingFileName, string lpNewFileName,
    CopyProgressRoutine lpProgressRoutine,
    int dwFlags);

public enum MoveFileOptions 
{
    MOVEFILE_COPY_ALLOWED = 0x2
}

И вызывая его с помощью:

if (!MoveFileWithProgress(source.FullName, destination.FullName, cpr, (int)options)) {
  throw new IOException(new Win32Exception().Message);
}

Где: options равно MoveFileOptions.MOVEFILE_COPY_ALLOWED

Работает нормально при движении вжесткий дискНо когда я пытаюсь перейти на Flash-диск, я получаю: The system cannot move the file to a different disk drive.

Почему?

Ответы [ 3 ]

3 голосов
/ 23 декабря 2011

Ваш DllImport неверен.Ваша функция имеет только 4 параметра, но реальная функция имеет 5. Предположительно, происходит то, что MOVEFILE_COPY_ALLOWED передается в lpData и игнорируется.Параметр dwFlags - это то, что происходит в стеке.

Исправление вашего p / invoke, вероятно, решит проблему.Кроме того, dwFlags должен быть без знака.

[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool MoveFileWithProgress(
    string lpExistingFileName,
    string lpNewFileName,
    CopyProgressRoutine lpProgressRoutine,
    IntPtr lpData,
    uint dwFlags
);

С этим исправлением вам нужно решить, что передать на lpData.Поскольку вы, кажется, не используете его в данный момент, это не имеет значения, и IntPtr.Zero кажется очевидным выбором.

3 голосов
/ 23 декабря 2011

С этого Microsoft |Страница Technet содержит:

Файл не может быть перемещен на другой диск одновременно с переименованием его с помощью команды Rename.переименование файла перед его перемещением.

2 голосов
/ 23 декабря 2011

Возможно, вы перемещаете каталог?

Согласно документации для MoveFileWithProgress на MSDN (выделение добавлено):

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...