Сбой CopyFile с кодом ошибки 3 (ERROR_PATH_NOT_FOUND)

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

Я пытаюсь скопировать файл в определенное место (и, если возможно, изменить его имя одновременно с копированием) с помощью Windows ‘ CopyFile функция.

Я создал пример программы, чтобы показать ошибку.

#include <iostream>
#include <Windows.h>
using namespace std;

int main()
{
cout << "Copy in progress" << endl;
bool X = CopyFile(L"test.txt", L"C:\\", 1); //NOT C: nor C:\\
if (!X){ cout << "FALLO AL COPIAR\n"; cout << "Error: "<<GetLastError();}
else{ cout << "COPIADO CORRECTO";  }
cin.get(); cin.get();
return 0;
}

GetLastError() возвращает 3 — что означает ERROR_PATH_NOT_FOUND — но, поверьте мне, я проверил каждый файл (test.txt находится в том же месте, что и встроенный .exe, я работаю от имени администратора …) и все равно выдает 3.

Я не могу заставить это работать. Обратите внимание на L«test» это сделано, потому что я использую Visual Studio с определенными настройками набора символов, я попытался изменить эту конфигурацию и использовать «test.txt» -> Still error 3.

-3

Решение

Вам необходимо указать имя файла:

bool X = CopyFile(L"test.txt", L"C:\\test.txt", 1);
2

Другие решения

Вы можете проверить подпись функции из MSDN:

BOOL WINAPI CopyFile(
_In_ LPCTSTR lpExistingFileName,
_In_ LPCTSTR lpNewFileName,
_In_ BOOL    bFailIfExists
);

Я полагаю, для этого не нужен целевой каталог (например, cp команда), но полное имя файла. Подсказка: убедитесь, что все каталоги до окончательного имени файла созданы при вызове CopyFile,

Еще один совет: в системах POSIX у вас нет схожей процедуры (ну, у вас есть что-то похожее на OS X, но это зависит от ОС). Тем не менее, вот что вы можете сделать (и это как CopyFile на самом деле работает за сценой)

  1. Откройте два дескриптора файла через open для POSIX или CreateFile для Windows. Один дескриптор открыт для чтения (исходный файл), а другой — для записи (целевой файл).
  2. Читать из дескриптора, который вы открыли для чтения во временный буфер (BUFSIZ размер буфера обычно достаточно).
  3. Запишите данные из буфера в дескриптор, открытый для записи.
  4. Повторяйте, пока в читаемом дескрипторе не появятся байты.

Это, как правило, работает, хотя специфичные для ОС подпрограммы могут быть настроены с некоторой черной магией (например, они могут выполнять отображение памяти, отправлять файл из одного дескриптора в другой без выхода из режима ядра и т. Д.).

1

пытаться:

CopyFile(L"test.txt", L"C:\\test.txt", 1);
0
По вопросам рекламы [email protected]