即使在我为我的应用程序授予管理员后也无法从 Windows 系统复制目录

Can't copy Directory from Windows system even after I give admin to my app

本文关键字:Windows 系统 复制 管理员 我的 应用程序      更新时间:2023-10-16


我创建了一个应用程序,当我使用 Windows 系统时,它将 C 驱动器 Windows 系统上的目录副本复制到另一个文件夹,我在这里使用这种方式给我的应用程序管理员。
我使用此代码复制文件夹及其所有内容。 此函数。

void MainWindow::copyPath(QString src, QString dst)
{
QDir dir(src);
if (! dir.exists())
return;
foreach (QString d, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
QString dst_path = dst + QDir::separator() + d;
dir.mkpath(dst_path);
copyPath(src+ QDir::separator() + d, dst_path);
}
foreach (QString f, dir.entryList(QDir::Files)) {
QFile::copy(src + QDir::separator() + f, dst + QDir::separator() + f);
}
}

并在按钮中

copyPath("C:/Windows/System32/spp/store", "D:/copyfolder");

当我在 D 驱动器上的另一个文件夹上进行测试时,它可以工作,所以我可以做些什么来让我的 qt 应用程序从 C 驱动器复制该文件夹。
当我给它这个路径时C:/Windows/System32/spp/它只复制一个C:/Windows/System32/spp/tokens的文件夹,而其他文件夹没有复制,当我给它路径C:/Windows/System32/spp/store时,它无法路径这个条件

QDir dir(src);
if (! dir.exists())
return;

它无法识别目录。 所以如果我可以用 C# 或任何其他方式做到这一点,请不要提供任何信息,因为我尝试使用 C# 但它也不起作用。

好吧,@markus发现了兔子,所以让我们把它变成一个答案。

64位Windows有一个名为文件系统重定向器的东西,它欺骗32位应用程序认为他们正在查看(例如)C:WINDOWSSYSTEM32而实际上他们不是。 该链接背后的详细信息。

但是,您可以将其关闭。 就原始 Win32 调用而言,您可以执行以下操作:

VOID *oldValue;
BOOL ok = Wow64DisableWow64FsRedirection (&oldValue);
// ...
ok = Wow64RevertWow64FsRedirection (oldValue);

很难想象为什么这些调用会失败。

还有:

BOOLEAN Wow64EnableWow64FsRedirection (BOOLEAN Wow64FsEnableRedirection);

这使您可以打开它(仅适用于受虐狂)或无条件关闭。

似乎没有调用来确定当前是否启用了重定向。 我想你可以做的是假设它在程序启动时启用(这将是),然后跟踪你自己所做的任何更改。