即使将管理员交给我的应用程序,也无法从Windows系统复制目录

时间:2018-07-09 05:40:38

标签: c++ qt permissions qt5


我创建一个应用程序,当我在Windows系统上工作时,它将C驱动器Windows系统上的目录副本复制到另一个文件夹,我使用这种方式here为应用程序管理员提供管理权限。
我使用此代码复制文件夹及其所有内容。 此功能。

    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时,它不能对这种情况进行路径< / p>

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

它无法识别目录。因此,例如,如果我可以使用C#或其他任何方式执行此操作,请没问题,请提供任何信息,因为我尝试使用C#时,它也无法正常工作。

1 个答案:

答案 0 :(得分:0)

好吧,@ markus发现了这只兔子,所以让我们来解决它。

64位Windows有一个称为File System Redirector的东西,它使32位应用程序以为他们正在看C:\WINDOWS\SYSTEM32而实际上却不是,他们愚弄了他们。该链接后面的详细信息。

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

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

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

还有:

BOOLEAN Wow64EnableWow64FsRedirection (BOOLEAN Wow64FsEnableRedirection);

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

似乎没有电话来查找当前是否启用了重定向。我猜您可以做的是假设它在程序启动时将启用(它将被启用),然后跟踪您自己进行的任何更改。