|
Hi guys,
I been working on a antivirus project as my final year project.. i have some problem with getting the list of all the files in a directory..
Lets say i choose C:/ and i want the list of all the files in the directory. Kindly help me with this ya... its a console program and i using DavC++ compiler...
Regards,
Thilek
|
|
|
|
|
Thilek wrote: Need help to get list of files in a directory...
Best answer is FindFirstFile/FindNextFile and other way that its not good using of DlgDirList Function.
Of one Essence is the human race
thus has Creation put the base
One Limb impacted is sufficient
For all Others to feel the Mace
(Saadi )
|
|
|
|
|
Since you are not using VC++ compiler, i'm sticking to pure windows apis. You could use FindFirstFile() and FindNextFile(). Check out this sample[^].
Regards,
Jijo.
_____________________________________________________
http://weseetips.com[ ^] Visual C++ tips and tricks. Updated daily.
|
|
|
|
|
JiJO raj,
thanks ya but its still showing 27
C:\Documents and Settings\Thilek\Desktop\2nd_trial\god\main.cpp cannot convert `const WCHAR*' to `const CHAR*' for argument `1' to `void* FindFirstFileA(const CHAR*, _WIN32_FIND_DATAA*)'
i running it on DevC++ since when i run it in VC++ express 2005 many header files missing in its library....
Any suggestions ???
|
|
|
|
|
Thilek wrote: thanks ya but its still showing 27
27 files? 27 compiler errors? Please explain.
Thilek wrote: C:\Documents and Settings\Thilek\Desktop\2nd_trial\god\main.cpp cannot convert `const WCHAR*' to `const CHAR*' for argument `1' to `void* FindFirstFileA(const CHAR*, _WIN32_FIND_DATAA*)'
This is a Unicode issue. You'll need to use wcout .
"Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
|
|
|
|
|
NOW I CAN RUN IT USING VC++ PROFF 2005 NO PROBLEM ..
Below is the code i use :
1.#include <windows.h>
2.#include <stdio.h>
3.#include <iostream>
4.#include <string>
5.#include <sstream>
6.
7.
8.
9.std::string convertWCharArrayToString(const WCHAR * const wcharArray) {
10. std::stringstream ss;
11.
12. int i = 0;
13. char c = (char) wcharArray[i];
14. while(c != '\0') {
15. ss <<c;
16. i++;
17. c = (char) wcharArray[i];
18. }
19.
20. std::string convert = ss.str();
21. return convert;
22.}
23.
24.int main()
25.{
26. WIN32_FIND_DATA findFileData;
27. HANDLE hFind = FindFirstFile((LPCWSTR)"*", &findFileData);
28.
29. if(hFind == INVALID_HANDLE_VALUE) {
30. std::cout <<"No files found." <<std::endl;
31. } else {
32. std::cout <<"Files found." <<std::endl;
33. }
34.
35. int fileNumber = 0;
36. std::cout <<fileNumber <<":" <<convertWCharArrayToString(findFileData.cFileName) <<std::endl;
37. while(FindNextFile(hFind, &findFileData)) {
38. fileNumber++;
39. std::cout <<fileNumber <<":" <<convertWCharArrayToString(findFileData.cFileName) <<std::endl;
40. }
41.
42. FindClose(hFind);
43.
44. char a;
45. std::cin>> a;
46. return 0;
47.}
But when i change HANDLE hFind = FindFirstFile((LPCWSTR)"*", &findFileData); to HANDLE hFind = FindFirstFile((LPCWSTR)"C:\*", &findFileData);
its showing no file found and some funny symbols... but i wanted it to show entire list of files in a directory if i choose C:\ or D:\ and so on..
Can u guys help me plz...
|
|
|
|
|
Thilek wrote: But when i change HANDLE hFind = FindFirstFile((LPCWSTR)"*", &findFileData); to HANDLE hFind = FindFirstFile((LPCWSTR)"C:\*", &findFileData);
Use two backslashes within string literals.
Why are you using convertWCharArrayToString() ?
"Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
|
|
|
|
|
Still the same i tried using HANDLE hFind = FindFirstFile((LPCWSTR)"C:\\*", &findFileData);
i even tried with "C://*" "C://" "C:\\"
still showing no files found and some funny symbols...
if i ever change it from "*" to anything this was happen..
hmmm... i am blur now...
Help me plz...
Thanks...
|
|
|
|
|
Thilek wrote: i even tried with "C://*" "C://" "C:\\"
What if you used *.* ?
Thilek wrote: still showing...some funny symbols...
How are you verifying this?
"Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
|
|
|
|
|
well it jus show the folder name where is the c++ files are located if i use "." ... its not moving out of the folder....
|
|
|
|
|
Thilek wrote: well it jus show the folder name where is the c++ files are located if i use "." ... its not moving out of the folder....
This makes little, if any, sense. Perhaps you are not understanding relative vs. absolute paths. For example, if you specified "*.*" , then ".\\*.*" is implied and the files in the current working directory (CWD) will be listed. If you specified "..\\*.*" , then the files in the CWD's parent folder will be listed. If you specified "c:\\*.*" , then the files in the root folder will be listed.
Consider:
void main( void )
{
WIN32_FIND_DATA findFileData;
HANDLE hFind = FindFirstFile(_T("*.*"), &findFileData);
if (hFind != INVALID_HANDLE_VALUE)
{
BOOL bFound = true;
int fileNumber = 0;
while (bFound)
{
fileNumber++;
wcout << fileNumber << _T(":") << findFileData.cFileName << endl;
bFound = FindNextFile(hFind, &findFileData);
}
FindClose(hFind);
}
}
"Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
|
|
|
|
|
but is there anyway if i type in C:/ or D:/ it will show files in the directory including the files in sub folders ???
|
|
|
|
|
Thilek wrote: but is there anyway if i type in C:/ or D:/ it will show files in the directory including the files in sub folders ???
Yes. The easiest solution is via a recursive function call. Examples are plentiful on the Web and here at CP.
"Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
|
|
|
|
|
thanks ya.. do u have any links related to that topics
|
|
|
|
|
Link 1
Link 2
Link 3
"Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
|
|
|
|
|
Thanks a lot my friend i try it out and update with u the results..
God bless you...
|
|
|
|
|
Directly take the output from findFileData.cFileName.
The problem exists in your convertWCharArrayToString().
std::cout <<fileNumber <<":" <<findFileData.cFileName <<std::endl;
|
|
|
|
|
well still the same.. if i put the exe file in C:/ and run it it shows the files and folders in C:/ but it does not going in further into the folders and get the file list....
The program i been working have to get the entire files in the subfolders.. since i am creating a anti-worm system...
thanks
|
|
|
|
|
Where do you have problem exactly?FindFirstFile is easy to use?
Of one Essence is the human race
thus has Creation put the base
One Limb impacted is sufficient
For all Others to feel the Mace
(Saadi )
|
|
|
|
|
You have to recursively call and iterate each Folders from the output if findFileData.dwFileAttributes is FILE_ATTRIBUTE_DIRECTORY.
Try that.
|
|
|
|
|
I want to hook a mouse events of a specified window. So, i install a WH_MOUSE hook callback procedure for that thread.
If i didn't hook that message, the thread would show a pop menu when it received a right button message.
After i hooked that thread, windows would call my callback procedure when such event occurred, but the original window's message handler would be called, too. But i want to hold such message to make the original window will not receive such message. I use global hooks but check the process id like:
LRESULT CALLBACK MouseHookProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
if(0 > nCode)
return CallNextHookEx(g_hPreviousMouseHook, nCode, wParam, lParam);
MOUSEHOOKSTRUCT *pMouseHooksStruct = (MOUSEHOOKSTRUCT *) lParam;
DWORD process_id;
GetWindowThreadProcessId(pMouseHooksStruct->hwnd,&process_id);
if(process_id==target_process_id){
.... my process
return 1;
}
return CallNextHookEx(g_hPreviousMouseHook, nCode, wParam, lParam);
}
that, target_process_id is stored in the shared segment block, im sure its ok.
How to fix such a problem?
Regards.
|
|
|
|
|
what happens if you dont call CallNextHookEx in the return statement ? (ie remove the CallNextHookEx and return [something else])
... it occurs to me that is what is propagating the message to the next handler.
'g'
|
|
|
|
|
you means the last? if the message is in the window handle i want to handle, the last CallNextHookEx will not be called.
|
|
|
|
|
Are you sure your hook is being called?
> The problem with computers is that they do what you tell them to do and not what you want them to do. <
|
|
|
|
|
of courese im sure. i place a messagebox at the if block, the messagebox will display there.
|
|
|
|