-
i've been trying all night and I can't figure out how place this code:
Code:
strcpy (FilePath, DirPath);
strcat (FilePath, FindData.cFileName);
DeleteFile(FilePath); // or remove(FilePath);
into this code:
Code:
WIN32_FIND_DATA FindData;
HANDLE hFind;
hFind = FindFirstFile(SearchPath, // Search path is the directory/filemask you want
&FindData);
if (hFind != INVALID_HANDLE_VALUE)
{
// Do whatever you want with the first file
while(FindNextFile(hFind,&FindData))
{
// Do whatever with the next.. and so on
}
FindClose(hFind); // Close the find handle
}
else
{
// There wern't any files
}
Could you please help me out here.
Thanks
-
Put it where the comments are that tell you to do whatever you want with the first file, and the other where it says do whatever you want with the next!!!!!!!!!!!!!!
I can't do more than this! I don't know how your code is set up, what your variables are called, or even what type they are! You have, here, a generic solution to your problem, AND, the information I am missing.
-
I have no idea what I am doing here, so you will have to bare with me here :). This is all I have so far and I have no idea how to get this to work...
Code:
#include <iostream.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
WIN32_FIND_DATA FindData;
HANDLE hFind;
hFind = FindFirstFile("C:\\My Documents\\Folder\\*.*", // Search path is the directory/filemask you want
&FindData);
if (hFind != INVALID_HANDLE_VALUE)
{
// Do whatever you want with the first file
while(FindNextFile(hFind,&FindData))
{
// Do whatever with the next.. and so on
}
FindClose(hFind); // Close the find handle
}
else
{
cout << "The folder is empty"; // There wern't any files
}
return 0;
}
Am I completely wrong? I have added the bits that the comments said, but for the others...I don't know where to go. Could you please help me out? I'm sorry for being so dumb, but I will learn from this, so it isn't a complete waste of time...I think...
Thanks
-Chris
-
Where the comments are that say do whatever, add the line...
cout <<FindData.cFileName<<endl;
I have created an empty project and put your code in it. I created a directory structure like yours, and copied some gash files into it. I added the lines above and now I get a list of files. Try this with your set up. If you get a list of files, then we'll go onto the next step.
-
ok...I have put together this code (thus taking another step) and I just need to know where to declare FileData and what to put in it...
Code:
#include <iostream>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>
int main()
{
WIN32_FIND_DATA FindData;
HANDLE hFind;
char DirPath[100] = "C:\\My Documents\\Chris\\Folder";
char FilePath[100] = "C:\\My Documents\\Chris\\Folder\\stuff.NMW";
strcpy (FilePath, DirPath);
strcat (FilePath, FileData.cFileName);
remove(FilePath);
hFind = FindFirstFile("C:\\My Documents\\Chris\\Folder\\*.*", // Search path is the directory/filemask you want
&FindData);
if (hFind != INVALID_HANDLE_VALUE)
{
cout <<FindData.cFileName<< "\n";
while(FindNextFile(hFind,&FindData))
{
cout <<FindData.cFileName<< "\n";
}
FindClose(hFind); // Close the find handle
}
else
{
cout << "There were no files found";
}
return 0;
}
-
I'm assuming you can see the files in the directory. Okay, as you've worked out, the DeleteFile() (or remove()) API calls require a complete path to the file they are to delete, so we must build that. Your DirPath string does not have the final "\" on it. After executing your strcat, your FilePath will look like this...
C:\\My Documents\\Chris\\FolderFileName
... you need...
C:\\My Documents\\Chris\\Folder\\FileName
... so fix that first.
Then you are trying to access something called FileData.cFileName. This does not exist. cFileName is a member of the WIN32_FIND_DATA structure, and in your program, you have called it FindData, (much more sensible actually!). So change your strcat from FileData to FindData.
You then need to put the strcpy/strcat/DeleteFile() where the cout's are which are currently outputting the filenames.
Try that.
-
brfore we go any furthur, I don't think you understand what I am trying to accomplish here. I am trying to get his to delete everything inside the folder, without knowing the actual filenames. Is this what is going on now?
-
YES! YES! YES!
<fx head bumping on the desk> bump bump bump </fx>
YES! YES! YES!
YOU don't know what files are in the directory, but to delete a file, the DeleteFile() function must be told. You cannot say "delete a file - I don't know what it is called" can you? Something has to link the contents of the directory to the mechanism for deleting the file. THAT is why you must log the contents of the directory with FindFirstFile() and FindNextFile()!!!!! You then pass the name of each file that they find to the delete service.
<fx> bump bump bump..... </fx> !!!
-
ohhh, sorry
oh ok. In the code that I gave you, should I have placed "C:\\My Documents\\Chris\\Folder\\stuff.NMW" into the string DirPath[100]?
-
No. DirPath is the path to the directory you are working with. Your initialisation of FilePath is meaningless, since you will overwrite it with the strcpy routine. FilePath is a dynamic entity, it will contain the directory path you do know, and the filenames you don't.
Fix the faults I mentioned, and move the code to where I said. Try it and tell me if we are there yet!
-
>>> Try it and tell me if we are there yet!
And soon. I'm not going to be here for a week or two after Friday lunch time, (central European time)!
Off to Greece for a bit of r 'n r!
-
Thank you so much for helping me out...the code looks great and works well and I have also learned how to do all this (:Dyay!:D). Just so you can see what the final product of all of these posts, here is the code:
Code:
#include <iostream>
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>
int main()
{
WIN32_FIND_DATA FindData;
HANDLE hFind;
char DirPath[100] = "C:\\My Documents\\Chris\\Folder";
char FilePath[100];
hFind = FindFirstFile("C:\\My Documents\\Chris\\Folder\\*.*",
&FindData);
if (hFind != INVALID_HANDLE_VALUE)
{
strcpy (FilePath, DirPath);
strcat (FilePath, "\\");
strcat (FilePath, FindData.cFileName);
remove(FilePath);
while(FindNextFile(hFind,&FindData))
{
strcpy (FilePath, DirPath);
strcat (FilePath, "\\");
strcat (FilePath, FindData.cFileName);
remove(FilePath);
}
FindClose(hFind);
}
else
{
cout << "There were no files found\n";
}
system("pause");
return 0;
}
Thanks again
-
Good. It's working. Now a few things you might want to think about.
1. At the moment you have a program which will delete all files in that directory. The directory is hard coded, as is the mask. For the purpose of this job, that is good enough, but what you could do is change this such that the working part of the program was a function that you passed the directory and mask to. You would then have a more useful item to keep in your "toolbox". (All programmers have a toolbox of little functions that do useful things that they can drop into their code as required). Consider...
ClearDirectory("C:\\Temp\\", "*.tmp"); // delete .tmp files
ClearDirectory("C:\\Program Files\\", *.log"); // delete log files
... see what I mean, useful.
2. You have used a string length of 100. Again, this is good enough for this job, but windows.h actually defines a value MAX_PATH which is the maximum allowable size of a path to a file. To make your general function, you should use this, (i.e. you should say char FilePath[MAX_PATH], rather than [100]). Currently the value assigned to MAX_PATH is 260, but you should use the name.
-
yeah, I know all about that *.* stuff.
-
oh yeah, and have a good time at Greece:D