Rocket Division Software
http://www.starburnsoftware.com/forum/

Walking thru a FileTree
http://www.starburnsoftware.com/forum/starburn-sdk-f3/walking-thru-filetree-t1999.html
Page 1 of 1

Author:  sitasoftware [ Tue Dec 01, 2009 10:13 am ]
Post subject:  Walking thru a FileTree

Hi folks.

I'd like to know how to walk thru a FileTree made from this:

StarBurn_ISO9660JolietFileTree_Create(FTrack, PCHAR(@ErrorText[1]), sizeof(ErrorText), Status,
@SitaBurnerCallback, @FTrackContext, TRUE,
FALSE, // No locked files - do not keep all the handles opened all the time
TRUE, // Use Level2 for ISO9660 names generation
FTrackType);

in which I need to remove some files matching a defined pattern.
I currently use a loop like this one:

procedure ScanDirectory(Track, DirNode: Pointer; FileMask: string);
// procedure recursive ************************
var
NewNode: Pointer;
Attributes: Integer;
FileName: string;
begin
FileName := GetNodeFileName(Track, DirNode);
NewNode := StarBurn_ISO9660JolietFileTree_GetFirstKid(FTrack, DirNode);
while NewNode <> nil do begin
FileName := GetNodeFileName(Track, NewNode);
Attributes := StarBurn_ISO9660JolietFileTree_GetAttributes(FTrack, NewNode);
if (Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY then
ScanDirectory(Track, NewNode, FileMask)
else
TestAndDeleteFile(Track, NewNode, FileMask);
NewNode := StarBurn_ISO9660JolietFileTree_GetNextKid(Track, DirNode, NewNode);
end;
end;


But I'm suspicious :? about the selected line above as it gives the next node but appears to ignore directories.
Something wrong with it ? :?:
Please note that code is DELPHI and this function is recursive and this may be the answer. :mrgreen:
My need is to have a working logic so that I can go thru ALL nodes in the tree. :wink:

Tanks a lot

Antonio.

Author:  sitasoftware [ Tue Dec 01, 2009 3:00 pm ]
Post subject:  Re: Walking thru a FileTree

Hi.

Got the solution on my own.
In the middle of the code, where either a directory or a file is processed, every time a file being selected by the file mask is deleted, the function returns to the caller. The later will restart a scan from the very beginning.
This takes time, of course, but works.

IF you are interested, have a look into the following code:
1. Calling master code snippet:

FIsoRoot := StarBurn_ISO9660JolietFileTree_GetRoot(FTrack);
// the loop is a tentative for eliminatig scan surprises
while (FIsoRoot <> nil) and ScanDirectory(FTrack, FIsoRoot, FileMask) do begin
FIsoRoot := StarBurn_ISO9660JolietFileTree_GetRoot(FTrack);
Res := StarBurn_ISO9660JolietFileTree_SeekToBegin(FTrack, PCHAR(@ErrorText[1]), sizeof(ErrorText), Status);
end;

2. the executive code:

function ScanDirectory(Track, DirNode: Pointer; FileMask: string): Boolean;
// procedure recursive ************************
var
NewNode: Pointer;
Attributes: Integer;
FileName: string;
begin
Result := False;
FileName := GetNodeFileName(Track, DirNode);
NewNode := StarBurn_ISO9660JolietFileTree_GetFirstKid(FTrack, DirNode);
while (NewNode <> nil) and (not Result) do begin
FileName := GetNodeFileName(Track, NewNode);
Attributes := StarBurn_ISO9660JolietFileTree_GetAttributes(FTrack, NewNode);
if (Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY then
Result := ScanDirectory(Track, NewNode, FileMask)
else
Result := TestAndDeleteFile(Track, NewNode, FileMask);
// as soon as we delete a node, get out giving control to our caller
if Result then
break;
NewNode := StarBurn_ISO9660JolietFileTree_GetNextKid(Track, DirNode, NewNode);
end;
end;

As a matter of conclusion, whenever a walk is made thru the FileTree and a node is deleted, the walker manager seems to loose control of the walker pointer for subsequent queries for NextKid. I guess this needs some fixing work.

BTW, if the goal is to have a Tree manipulation, some other functionnalities present into the most basic Tree (either visual or not) could be welcome and for instance: HasChildren (instead to have to test for a directory, which is time consuming).

Anyway, this fix is time consuming when the tree has a lot of files (26000 in my case).
On another point of view, I was really looking for something which could help to avoid some files not to be loaded into the tree (aka ZipForge with their ExclustionMasks).

Antonio.

Author:  anton (staff) [ Tue Dec 01, 2009 4:24 pm ]
Post subject:  Re: Walking thru a FileTree

Thank you~ We love self-suppring customers :)

P.S. I've moved the thread to the right forum.

Page 1 of 1 All times are UTC
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/