【问题标题】:Win32 CopyFile can't copy to external driveWin32 CopyFile 无法复制到外部驱动器
【发布时间】:2020-02-13 00:42:41
【问题描述】:

我正在创建一个使用CopyFileW 将文件复制到外部拇指驱动器的Windows 服务。 一切都按预期工作,但问题是 Windows 将文件复制到拇指驱动器并显示为“文件”类型,既不能删除、复制、移动也不能重命名。
我试过GetLastError 并且没有错误,即CopyFile 返回true
如果目标文件在C 驱动器上,它确实有效。 这是负责复制文件的代码:

LPWSTR filename = PathFindFileNameW(file.first.c_str());
LPWSTR mediaFilePath = new WCHAR[1000];
wcscpy_s(mediaFilePath, 255, lpdbv->dbcc_name);
wcscat_s(mediaFilePath, 255, L"\\");
wcscat_s(mediaFilePath, 255, filename);

bool copied = CopyFileW(file.first.c_str(), mediaFilePath, false);
if (!copied) {
    logToFile(L"Couldn't copy file, error " + GetLastError());
}

【问题讨论】:

  • 我正在使用 std::wstring c_str() 函数,它返回 char* 而不是 wchar_t*CopyFileW 需要 LPCWSTR
  • @VTT 哦,确实如此,我删除了,问题仍然存在
  • 如果目标文件位于 C 盘而不是 U 盘上,它是否有效?如果您使用CreatFileReadFileWriteFile 等自行复制文件,是否有效?
  • @Jabberwocky 我忘了说,我试过了,它确实有效
  • @MekacherAnis 我的评论已被编辑,请按 F5。你应该edit你的问题并提及。

标签: c++ winapi windows-services file-copying


【解决方案1】:

由于“paddy”的注释,我终于找到了错误,这是目标文件名的问题,转储它并以十六进制查看后,我发现它附加了0x00 0x20,它是WCHAR空间。在最后删除那个多余的字符后,问题就解决了。

【讨论】:

  • PathFindFileNameW() 不附加任何内容,它只是返回一个指向所提供输入字符串中文件名第一个字符的指针。所以空格字符必须已经存在于原始字符串中。
  • @Remy Lebeau 你是对的,它已经在字符串中,并且 1000 WCHAR 的问题是拼写错误,因为这是一个快速的 hacky 代码而不是完成的代码
猜你喜欢
  • 2017-08-29
  • 2020-12-10
  • 2020-02-28
  • 1970-01-01
  • 2014-09-13
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
相关资源
最近更新 更多