1

こんにちは、ディレクトリ内のすべてのファイルをループするスクリプトがありますが、このようにループしている間はコンソールを非表示にする必要があります。スクリプトの一部を次に示します。

#include <iostream>
#include <fstream>
#include <Windows.h>
using namespace std;

 int GetFilesInDirectory(const char * dir,string dest[],unsigned int max){
    string loc=dir;
    int ctr=0;
    if(loc.length()>2)
        if(loc.substr(loc.length()-2,1)=="\\")
            loc=loc.substr(0,loc.length()-1);
    string opcommand;
    string delcommand;
    if(loc.length()>2){
        opcommand="cd "+(loc)+" && dir /s /b /a > tmpfile.cpptmp";
        delcommand="cd "+(loc)+" && del tmpfile.cpptmp";
    } else {
        opcommand="dir /s /b /a > tmpfile.cpptmp";
        delcommand="del tmpfile.cpptmp";
    }
    system(opcommand.c_str());
    ifstream f;
    string line;
    string fileloc;
    if(loc.length()>2)
        fileloc=(loc)+"\\tmpfile.cpptmp";
    else fileloc="tmpfile.cpptmp";
    f.open(fileloc,ios::binary);
    while(f.good()){
        getline(f,line);
        if(line.length()>1&&ctr<max){
            dest[ctr]=line;
            ctr++;
        }
    }
    f.close();
    system(delcommand.c_str());
    return ctr;
}
int main() {
    FreeConsole();
    const unsigned int filescountmax=16184;

    string files[filescountmax];
    int count=GetFilesInDirectory("\\",files,filescountmax);
    string ext;
    for(int i=0;i<count;i++){
            //some script

    }
}

プロセスが開始されると、プロセスは非表示になりますが、しばらくするとcmd.exeが表示され、プロセスが閉じます。ちなみに、ディレクトリ内のファイルをループする方法は他にもあることは知っていますが、これはサブディレクトリ内のファイルやサブディレクトリのサブディレクトリなどもループする最も簡単な方法です。助けてくれませんか?

4

4 に答える 4

1

サブシステムを変更して、Windowsがコンソールを非表示にすることができます。次のコマンドをソースコードに追加します。

#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

CreateProcessまたは、フラグを使用して関数を試すことができますCREATE_NO_WINDOW

于 2012-09-23T17:17:21.040 に答える
0

これは私がそのようなタスクのために書いたシステム関数のアナログです。

int system_hidden(const char *cmdArgs)
{
    PROCESS_INFORMATION pinfo;
    STARTUPINFO sinfo;

    /*
     * Allocate and hide console window
     */
    AllocConsole ();
    ShowWindow (GetConsoleWindow(), 0);

    memset (&sinfo, 0, sizeof (sinfo));
    sinfo.cb = sizeof (sinfo);
    CreateProcess (NULL, (char*)cmdArgs,
                   NULL, NULL, false,
                   0,
                   NULL, NULL, &sinfo, &pinfo);
    DWORD ret;
    while (1)
    {
        HANDLE array[1];
        array[0] = pinfo.hProcess;
        ret = MsgWaitForMultipleObjects (1, array, false, INFINITE,
                                         QS_ALLPOSTMESSAGE);
        if ((ret == WAIT_FAILED) || (ret == WAIT_OBJECT_0))
            break;
        /*
         * Don't block message loop
         */
        MSG msg;
        while (PeekMessage (&msg, 0, 0, 0, PM_REMOVE))
        {
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
    }

    DWORD pret;
    GetExitCodeProcess (pinfo.hProcess, &pret);
//    FreeConsole ();
    return pret;
}
于 2012-09-23T19:13:27.410 に答える