Поэтому, прежде чем начать, я исследовал (не только на переполнение стека), и я не могу найти решение своей проблемы.
Я пытаюсь скопировать файл в определенное место (и, если возможно, изменить его имя одновременно с копированием) с помощью 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.
Вам необходимо указать имя файла:
bool X = CopyFile(L"test.txt", L"C:\\test.txt", 1);
Вы можете проверить подпись функции из MSDN:
BOOL WINAPI CopyFile(
_In_ LPCTSTR lpExistingFileName,
_In_ LPCTSTR lpNewFileName,
_In_ BOOL bFailIfExists
);
Я полагаю, для этого не нужен целевой каталог (например, cp
команда), но полное имя файла. Подсказка: убедитесь, что все каталоги до окончательного имени файла созданы при вызове CopyFile
,
Еще один совет: в системах POSIX у вас нет схожей процедуры (ну, у вас есть что-то похожее на OS X, но это зависит от ОС). Тем не менее, вот что вы можете сделать (и это как CopyFile
на самом деле работает за сценой)
open
для POSIX или CreateFile
для Windows. Один дескриптор открыт для чтения (исходный файл), а другой — для записи (целевой файл).BUFSIZ
размер буфера обычно достаточно).Это, как правило, работает, хотя специфичные для ОС подпрограммы могут быть настроены с некоторой черной магией (например, они могут выполнять отображение памяти, отправлять файл из одного дескриптора в другой без выхода из режима ядра и т. Д.).
пытаться:
CopyFile(L"test.txt", L"C:\\test.txt", 1);