c ++ - Samme CMD-kommando gør to forskellige ting

Indlæg af Hanne Mølgaard Plasc

Problem



Formålet er at finde nye/ændrede/slettede filer.
00tobedeleted er den mappe, jeg oprettede i C: \ Windows \ System32.


Når jeg kører følgende kommando via CMD:


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


Intet går galt, filen er oprettet, alt er ok.


Når jeg forsøger at gøre det samme i Visual Studio:


system("dir " + path\_to\_check + "/s /b > " + path\_to\_save + "filepaths.txt").c\_str();


Udgangen er 'Fil ikke fundet' . Måske er det på grund af mappen/filrettighederne (når jeg scanner C: \ Windows \ System32 alt det er okay også). Spørgsmålet er, hvordan kan jeg få filepaths for alle filer (også skjult osv.) med 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);
}


Indstil checksum:


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());
}

Bedste reference


Brug dobbelt/til din kommandostreng.


Systemfunktionen konverterer din streng med en anden flugtsekvens.


Så hvis du kun sender 2 \ i din streng, løber det ud på næste tegn.


Så hvis strengen du sender er


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


Dette vil blive kørt som


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


På cmdlinien.


Du skal bruge følgende til dine stier


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


Ansvarsfraskrivelse: Jeg har testet systemkommandoen på et Linux-system. Ikke rigtig sikker på, om det samme ville fungere på samme måde på vinduer.


Jeg håber det hjælper.

Andre referencer 1


Stadig søger efter løsning fungerer std :: filesystem ikke for mappe 00tobedeleted, og det er også langsommere.


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


@Redigere:
ShellExecute gør ikke det trick også


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