相同的CMD命令执行两个不同的操作

时间:2018-05-22 08:53:14

标签: c++ windows visual-studio cmd access-rights

目的是找到任何新的/修改/删除的文件。 00tobedeleted 是我在C:\ Windows \ System32中创建的文件夹。

当我通过CMD运行以下命令时:

dir C:\Windows\System32\00tobedeleted /s /b > E:\Database\filepaths.txt

没有错,文件已创建,一切正常。

当我尝试在Visual Studio中执行相同操作时:

system("dir " + path_to_check + "/s /b > " + path_to_save + "filepaths.txt").c_str();

输出“找不到文件”。也许这是因为文件夹/文件权限(当我正在扫描 C:\ Windows \ System32 时,它也没关系)。问题是,如何使用Visual Studio获取所有文件的文件路径(隐藏等等)?

path_to_check is obviously "C:\\Windows\\System32\\00tobedeleted "
and path_to_save is "E:\\Database\\"

主:

#include "database.h"
using namespace std;

int main()
{
    string path_to_check = "C:\\Windows\\System32\\00tobedeleted ", path_to_save = "E:\\Database\\", export_path = "E:\\Database\\";
    Database database;
    database.set_files_checksum(path_to_check, path_to_save);
}

设置校验和:

void Database::set_files_checksum(string path_to_check, string path_to_save)
{
    string file;
    system(("dir " + path_to_check + "/s /b > " + path_to_save + "filepaths.txt").c_str());
}

2 个答案:

答案 0 :(得分:0)

使用double /作为命令字符串。

系统函数将您的字符串转换为另一个转义序列。

因此,如果您只在字符串中发送2 \,它将在下一个字符上运行转义。

因此,如果您发送的字符串是

"dir C:\\Windows\\System32\\00tobedeleted /s /b > E:\\Database\\filepaths.txt"

这将以

的形式运行
dir C:WindowsSystem3200tobedeleted /s /b > E:Databasefilepaths.txt

在cmdline上。

您需要将以下内容用于路径

C:\\\\Windows\\\\System32\\\\00tobedeleted
E:\\\\Database\\\\filepaths.txt

免责声明:我已在linux系统上测试过系统命令。不确定在Windows上是否会以相同的方式工作。

我希望这会有所帮助。

答案 1 :(得分:0)

仍在搜索解决方案,std :: filesystem对文件夹00也不起作用,此外,它也慢了。

#include <iostream>
#include <string>
#include <filesystem>
#include <fstream>
namespace fs = std::experimental::filesystem;
using namespace std;
void cmd_method(string path_to_check, string path_to_save)
{
    system(("dir " + path_to_check + " /s /b > " + path_to_save + "filepaths.txt").c_str());
}

void filesystem_method(string path_to_check, string path_to_save)
{   
    ofstream paths_o;
    string file;
    paths_o.open(path_to_save+"filepaths.txt");
    for (auto & p : fs::recursive_directory_iterator(path_to_check))
    {
        paths_o << p << endl;
    }
}

int main()
{
    std::string path_to_check = "C:\\Windows", path_to_save = "E:\\";
    filesystem / cmd _method(path_to_check, path_to_save);
    system("pause");
}

@Edit: ShellExecute也没有做到这一点

ShellExecute(0, "open", "cmd.exe", "/C dir C:\\Windows\\System32 /s /b > E:\\Database\\out.txt", 0, SW_SHOW);