Este es mi código:
#pragma once
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <tchar.h>
#include <process.h>
#include <string.h>
#include <direct.h>
#include <stdlib.h>
#define MAX_THREAD 19
#define BUFSIZE 4096
using namespace std;
typedef struct Param {
string filein;
string parola;
set<string>* myset;
CRITICAL_SECTION* wcs;
HANDLE* semaforo;
}
unsigned int WINAPI myRun(LPVOID lpParam) {
Param *pa=reinterpret_cast<Param*>(lpParam);
size_t pos;
string s;
ifstream fin;
fin.open(pa.filein.c_str());
pair<set<string>::iterator,bool> ret;
while(getline(fin,s)) {
pos=s.find(pa.parola);
if (pos!=string::npos) {
try {
EnterCriticalSection(*pa.wcs);
ret=pa.myset->insert(pa.filein);
} catch(Exception e) {
ReleaseSemaphore(*(pa.semaforo),1L,NULL);
}
break;
}
}
fin.close();
ReleaseSemaphore(*(pa.semaforo),1L,NULL);
delete pa;
return 0;
}
int ricercaParola(string path, string parola) {
string dirname=getPath(path.c_str());
WIN32_FIND_DATA file1;
HANDLE fd=INVALID_HANDLE_VALUE;
dirname+="\*";
fd=FindFirstFile(dirname.c_str(),&file1);
if(fd==INVALID_HANDLE_VALUE)
return -1;
while(FindNextFile(fd,&file1)!=0) {
if((file1.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)!=0) {
if((strcmp(file1.cFileName,".")!=0) && (strcmp(file1.cFileName,"..")!=0)) {
string subdir=dirname;
string::iterator its=subdir.end();
its--;
subdir.erase(its);
subdir+=file1.cFileName;
ricercaParola(subdir,parola);
}
}
else {
string nameF=dirname;
string::iterator its=nameF.end();
its--;
nameF.erase(its);
nameF+=file1.cFileName;
WaitForSingleObject(semaforo,INFINITE);
pa.filein=nameF;
pa.parola=parola;
HANDLE hthread= (HANDLE)_beginthreadex(NULL,0,&myRun,reinterpret_cast<void*>(parameter),0,NULL);
CloseHandle(hthread);
}
}
FindClose(fd);
return 0;
}
void produceFileOut() {
ofstream fout;
fout.open(fileOut);
set<string>::iterator it=myset->begin();
for(;it!=myset->end();it++) {
fout<<(*it).c_str()<<endl;
}
fout.close();
}
string getPath(const char* filename) {
DWORD retval = 0;
char fullPath[BUFSIZE]=TEXT("");
LPTSTR lpszFilePart = NULL;
retval = GetFullPathName(filename,BUFSIZE,fullPath,&lpszFilePart);
string value=reinterpret_cast<const char*>(fullPath);
return value;
}
int main(int argc, char* argv[]) {
string path;
string parola;
char* fileOut;
set<string>* myset;
Win32Critical_Section* wcs;
HANDLE semaforo;
if(argc != 4) {
printf("nUsage: %s nome,directory,stringa da ricercare,fileoutn",argv[0]);
return (-1);
}
path=reinterpret_cast<const char*>(argv[1]);
parola=reinterpret_cast<const char*>(argv[2]);
fileOut=argv[3];
myset=new set<string>();
wcs=new Win32Critical_Section();
pa.semaforo=CreateSemaphore(NULL, MAX_THREAD, MAX_THREAD, NULL);
if(ricercaParola(path,parola)<0) {
printf("npath errato o directory non presente nel path specificato n");
return -1;
}
for(int i=0; i < MAX_THREAD; i++ )
WaitForSingleObject(semaforo,INFINITE);
if(myset->size()==0)
cout<<"la stringa richiesta non è presente nella directory specificata"<<endl;
else
produceFileOut();
return 0;
}
Es de un código que me pasaron en C++ sobre Linux, que yo lo estoy adaptando a C, por eso me hago un poco de lío con las cabeceras.
Muchas gracias. Saludos.