【问题标题】:Same CMD command does two different things同一个 CMD 命令做两个不同的事情
【发布时间】:2018-05-23 19:03:07
【问题描述】:

目的是查找任何新的/修改的/删除的文件。 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());
}

【问题讨论】:

  • 首先将整个系统命令组合成一个字符串,这样您就可以看到实际传递给system 调用的内容。
  • 这是我尝试的第一件事,如果有错误我不会在这里发布:)
  • 还有什么是system? ANSI system 调用返回int,那么system(str).c_str() 是什么意思?
  • @Mofi:不,system会使用系统的“由命令处理器执行”;在 Windows 上默认为 CMD.EXE(在 UNIX 上默认为 sh)。
  • 您可以使用进程监视器查看 PC 上 File Not Found 输出的原因。我想您已将代码编译为 x86 应用程序,导致访问不包含子文件夹 00tobedeleted%SystemRoot%\SysWOW64,因为您在 %SystemRoot%\System32 中创建了该子文件夹。请参阅 Microsoft 的 file system redirector 文档。您需要在您的 32 位应用程序中使用 "C:\\Windows\\Sysnative\\00tobedeleted" 来获取正确目录的文件列表。

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


【解决方案1】:

使用双 / 作为您的命令字符串。

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

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

所以如果你发送的字符串是

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

这将运行为

dir C:WindowsSystem3200tobedeleted /s /b > E:Databasefilepaths.txt

在命令行上。

您需要在路径中使用以下内容

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

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

我希望这会有所帮助。

【讨论】:

  • 不幸的是,它从 File Not Found 输出到不正确的目录语句,所以我想这不起作用。尽管如此,谢谢
  • 好的。那一定是Windows的事情。尝试将文件路径回显到文件,然后读取它。我认为早些时候当你尝试编译字符串然后检查它的内容时,你一定使用了类似于 printf 的东西。有了这个,您将确定 cmdline 得到什么。请记住使用系统函数运行 echo 命令,并将文件路径作为参数。
  • 不,在 C(和类似的语言)中,双反斜杠已经转义了。所以 \\ 会以 \ 的形式出现,这是有意的。
  • @Christian.K:我根据我所做的测试写了答案,而不仅仅是基于我的意见或知识或我在网上阅读的内容。我目前使用的是 MacBook Air,这就是为什么我声明测试是在一个 linux 系统上完成的(在后面的网站上我应该提到它是一个 mac)
  • @Nitro 我并没有暗示,更不用说写,你上面所说的关于在回答之前进行研究的任何内容。我只是指出答案有什么问题,以防其他人出现(未更正)。不要冒犯(以防万一)。
【解决方案2】:

仍在寻找解决方案,std::filesystem 对文件夹 00tobedeleted 也不起作用,而且速度较慢。

#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");
}

@编辑: ShellExecute 也不行

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多