Та же команда CMD делает две разные вещи - PullRequest
0 голосов
/ 22 мая 2018

Целью является поиск любых новых / измененных / удаленных файлов. 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\\"

Main:

#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 голосов
/ 23 мая 2018

Все еще в поисках решения, 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);
0 голосов
/ 22 мая 2018

Используйте double / для вашей командной строки.

Системная функция преобразует вашу строку с другой escape-последовательностью.

Так что, если вы отправите только 2 \ в вашей строке, она запустит escapeна следующий символ.

Таким образом, если отправленная вами строка будет

"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.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...