|
Sure Jonathan, I have the privilege. I am admin and I can manually delete such files. I think there should be something wrong with my program, but through debugging for almost an hour, I still can not find the reason. Any ideas?
regards,
George
|
|
|
|
|
I think the problem is that the first file you will 'find' is the current folder '.', you will get an access denied if you try to delete this, so you need to exclude both '.' and '..' from your wildcard search, something like this (obviously could be optimised, this is just to show an example):
Also, you could make it recursive if you wanted to delete sub folders too.
int remove_non_empty_directory(const char* path)
{
WIN32_FIND_DATA FindFileData;
int rtn;
HANDLE hFind = FindFirstFile(path, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
FindClose(hFind);
return -1;
}
else
{
bool bDelete = true;
if((_tcsicmp(FindFileData.cFileName, "..") == 0) || (_tcsicmp(FindFileData.cFileName, ".") == 0))
bDelete = false;
if(bDelete)
{
rtn = DeleteFile((LPCSTR)FindFileData.cFileName);
}
while (FindNextFile(hFind, &FindFileData) != 0)
{
bDelete = true;
if((_tcsicmp(FindFileData.cFileName, "..") == 0) || (_tcsicmp(FindFileData.cFileName, ".") == 0))
bDelete = false;
if(bDelete)
rtn = DeleteFile((LPCSTR)FindFileData.cFileName);
FindClose(hFind);
}
return 0;
}
And change this code:
DeleteFile(&(FindFileData.cFileName));
to this:
DeleteFile((LPCSTR)FindFileData.cFileName);
regards,
-- modified at 7:09 Monday 30th July, 2007
|
|
|
|
|
Thanks Jonathan,
I have tried and slightly modified your program to make it compile.
Now the error condition is, error number 2 -- system can not find specified file. I am confused since the file actually exists.
I need to using absolute path other than relative path to delete the file?
<br />
int remove_non_empty_directory(const char* path)<br />
{<br />
WIN32_FIND_DATA FindFileData;<br />
int rtn;<br />
HANDLE hFind = FindFirstFile(path, &FindFileData);<br />
int bDelete = 0;<br />
<br />
if (hFind == INVALID_HANDLE_VALUE)<br />
{ <br />
FindClose(hFind);<br />
return -1;<br />
}<br />
else<br />
{<br />
if((_tcscmp((LPCSTR)FindFileData.cFileName, "..") == 0) || (_tcscmp((LPCSTR)FindFileData.cFileName, ".") == 0))<br />
{<br />
bDelete = 0;<br />
}<br />
if(bDelete)
{<br />
rtn = DeleteFile((LPCSTR)FindFileData.cFileName);
}<br />
while (FindNextFile(hFind, &FindFileData) != 0)<br />
{<br />
bDelete = 1;<br />
if((_tcscmp((LPCSTR)FindFileData.cFileName, "..") == 0) || (_tcscmp((LPCSTR)FindFileData.cFileName, ".") == 0))<br />
{<br />
bDelete = 0;<br />
}<br />
if(bDelete)<br />
{<br />
rtn = DeleteFile((LPCSTR)FindFileData.cFileName);<br />
if (0 == rtn)<br />
{<br />
ErrorExit (NULL);<br />
}<br />
}<br />
}<br />
FindClose(hFind);<br />
}<br />
<br />
return 0;<br />
}<br />
regards,
George
|
|
|
|
|
which line is producing error 2, and what is the value of FindFileData.cFileName at that point ?
|
|
|
|
|
Relative file name.
regards,
George
|
|
|
|
|
George_George wrote: I have tried and slightly modified your program to make it compile.
George_George wrote: I need to using absolute path other than relative path to delete the file?
Yes, in this case you should.
regards,
|
|
|
|
|
Thanks Jonathan,
I have tried that if I am using absolute path, it works!
regards,
George
|
|
|
|
|
Try
DeleteFile(FindFileData.cFileName);
instead of
DeleteFile(&(FindFileData.cFileName));
|
|
|
|
|
I have tried and the error is the same. Any further debug ideas?
regards,
George
|
|
|
|
|
George_George wrote: Any further debug ideas?
See my last post regarding '.' and '..'
|
|
|
|
|
Yes, they are the key points.
regards,
George
|
|
|
|
|
I think it happens because FindFile Handle i.e. hFind is open.
I have faced similar issue with CFileFind.Try to delete after you close the handle.
|
|
|
|
|
Hi SandipG,
I have tried that it does not matter.
regards,
George
|
|
|
|
|
Hello George_George, I'll tell u the exact problem u r having and how to rectify it.
Your Code:-------------------------------------------------
int remove_non_empty_directory (const char* path)<br />
{<br />
<br />
WIN32_FIND_DATA FindFileData;<br />
HANDLE hFind;<br />
int rtn;<br />
<br />
hFind = FindFirstFile(path, &FindFileData);<br />
if (hFind == INVALID_HANDLE_VALUE)<br />
{<br />
FindClose(hFind);<br />
return -1;<br />
}<br />
else<br />
{<br />
rtn = <pre>DeleteFile(&(FindFileData.cFileName));</pre><br />
<code>if (0 == rtn)<br />
{<br />
ErrorExit (NULL);<br />
}<br />
<br />
while (FindNextFile(hFind, &FindFileData) != 0)<br />
{<br />
rtn = <pre>DeleteFile(&(FindFileData.cFileName));</pre><br />
<code>}<br />
<br />
FindClose(hFind);<br />
}
----------------------------------------------------------
The problem lies in the highlighted lines. FindFileData.cFileName contains only the FILE NAME, NOT PATH. So the problem. Rectify it by replacing the highlighted lines by DeleteFile(path);
Come online at:-
jubinc@skype
|
|
|
|
|
Don Box wrote: Rectify it by replacing the highlighted lines by DeleteFile(path);
That won't work as he is most likely passing in just a folder name, or a folder name with a wildcard attached.
He should take the original path (excluding wildcard) and then add the filename from FindFileData.cFileName and then Delete that.
regards,
|
|
|
|
|
You are always right, Jonathan!
regards,
George
|
|
|
|
|
George_George wrote: You are always right, Jonathan!
Only most of the time
best wishes,
|
|
|
|
|
Thanks Don!
It works! Cool!
regards,
George
|
|
|
|
|
Hi
I was just looking at your problem and why not try someting completely different.
You could create a batch file which deletes the files within a folder.
1. Create a new text file for writing to (say on your c:\) with the extension of ".BAT"
2. Write to that file the path of the directory you want to delete, fprintf(cfile,"del %s\*.*",pathname)
3. Close the file
4. Using the SPOOL command run the file.
Just a quick solution to your problem.
Bry.
|
|
|
|
|
Thanks Bryster,
I need to implement through Windows API to be more efficient.
regards,
George
|
|
|
|
|
Are you sure that those files are not read only.
As once i wasalso facing the same problem but after checking out read only attribute. it was working fine...
Who am I?
Do you know me....
|
|
|
|
|
George_George wrote: I am using the following program to delete all files in a specified directory.
Why not just use SHFileOperation() ?
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Sure, gvisgr8. I have enough privilege.
regards,
George
|
|
|
|
|
Because I suspect on Windows Mobile it is not supported -- I need to write program for both Windows desktop and Window CE.
regards,
George
|
|
|
|
|
George_George wrote: Sure, gvisgr8.
I'm not gvisgr8.
George_George wrote: I have enough privilege.
I was not concerned with privileges. I was simply suggesting replacing dozens of lines of code with a single one.
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|