你好,我有一个非常独特的情况希望解决方案很简单…
我正在写一个备份程序,它使用卷影复制服务来冻结要备份的文件的状态。我不能直接遍历影子副本使用QDir设置为副本ie \?GLOBALROOTDeviceHarddiskVolumeShadowCopy37由于某种原因,QDir不喜欢这样(也许同样的原因让我头疼?)。相反,我以编程方式遍历一个符号链接,指向要备份的驱动器的卷影副本。如果我尝试备份整个驱动器并遍历符号链接到影子副本的文件夹的根目录,QDir将给出空的entryList() QStringLists。如果我备份驱动器上的一个文件夹,只遍历符号链接的影子复制文件夹中的那个文件夹,一切都很好。
所以…如果我尝试备份O: entryList()是空的。如果我尝试备份O:backupfolder entryList()列出内容,每个人都很高兴。
我已经验证了使用Nirsoft的ShadowCopyView成功创建了影子副本。我还添加了source.append("awef");在scanDir调用之前,当尝试备份整个驱动器和子目录awef成功备份时,我们知道影子副本和符号链接已成功创建。
代码如下:
CreateSymbolicLink(vssDir.path().toStdWString().c_str(), snapVol.toStdWString().c_str(), SYMBOLIC_LINK_FLAG_DIRECTORY)
//vssDir is a folder on the root of the C drive to be traversed programmatically
//snapVol is the shadow copy ie \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy37
HANDLE hFile = CreateFile(vssDir.absolutePath().toStdWString().c_str(), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, 0);
//locks the link IIRC
scanDir(source,target); //called from arbitrary location in program
void Worker::scanDir(QDir source, QDir target, BackupJob &job)
{
source.setFilter(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::NoSymLinks);
target.setFilter(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::NoSymLinks);
getFileSizes(source, target, job);
QStringList dirList = source.entryList(); //empty for root of symbolically linked folder
for (int count = 0; count < dirList.count() && cancel == false; ++count)
{
QString newPath = QString("%1/%2").arg(source.absolutePath()).arg(dirList.at(count));
QString newPath2 = QString("%1/%2").arg(target.absolutePath()).arg(dirList.at(count));
scanDir(QDir(newPath),QDir(newPath2),job);
}
}
void Worker::getFileSizes(QDir source, QDir target, BackupJob &job)
{
source.setFilter(QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks);
target.setFilter(QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks);
QStringList sourceFileList = source.entryList(); //empty for root of symbolically linked folder
QStringList targetFileList = target.entryList(); //empty for root of symbolically linked folder
for (int aCount = 0; aCount < sourceFileList.count(); aCount++)
{
//code to add files to be backed up...
}
}
我发现了问题,一些很傻的东西…我需要在snapVol QString的末尾添加反斜杠以使阴影复制路径? HarddiskVolumeShadowCopy37 GLOBALROOT 设备这是引导我找到这个信息的页面…