| |||
| [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] |
Why aren't you using fts? Someone posted an example in the last thread.
-- Finlay
On Sun, 31 Oct 2004 14:12:58 +0100, Dominik Freyer <email@hidden> wrote:Hi there,
I'm still trying to determine directory sizes for big filesystem trees.
I've been running about a problem I couldn't get rid of. My function
that uses the du tool in a NSTask to get the size of a file or dir runs
most of the time very well. If the file that has to be size-determined
is a symbolic link the size will be 4 (which is correct) and gets
returned, but after returning to the calling method all variables of
this method are empty and I get an EXC_BAD_ACCESS. I know, that I get
this, because I'm trying to access some values of the no more available
variables. This behaviour doesn't appear, if a directory or every other
file is determined.
I got rid of this problem by testing the file-type and ignoring
symbolic links, but I found the same problem with a file in my
~/Library/Application Support/Adress Book/images Folder called
6D35A9EE-063A-11D8-9905-0030657AB734. It is a 4 KB file (the same size
of a symbolic link) but not shown as a link in Finder or Terminal. Here
the both important methods:
This method uses du as a NSTask and returns the determined size to the
calling method
- (NSNumber*)getSizeOfDirectory:(NSString*)path
{
NSNumber *sizeField;
if([[[NSFileManager defaultManager] fileAttributesAtPath:path
traverseLink:NO]fileType]!=NSFileTypeSymbolicLink ||
[[[NSFileManager defaultManager] fileAttributesAtPath:path
traverseLink:NO]fileType]!=NSFileTypeUnknown)
{
NSArray *args;
NSPipe *fromPipe;
NSFileHandle *fromDu;
NSData *duOutput;
NSString *size;
NSArray *stringComponents;
unsigned char aBuffer[70];
args = [NSArray arrayWithObjects:@"-ks",path,nil];
fromPipe=[NSPipe pipe];
fromDu=[fromPipe fileHandleForWriting];
NSTask *duTool=[[NSTask alloc]init];
[duTool setLaunchPath:@"/usr/bin/du"];
[duTool setStandardOutput:fromDu];
[duTool setArguments:args];
[duTool launch];
duOutput=[[fromPipe fileHandleForReading] availableData];
[duOutput getBytes:aBuffer];
size=[NSString stringWithCString:aBuffer];
stringComponents=[size pathComponents];
size=[stringComponents objectAtIndex:0];
size=[size substringToIndex:[size length]-1];
return sizeField =[NSNumber numberWithUnsignedLongLong:(unsigned
long long)[size doubleValue]];
}
else return sizeField=[NSNumber
numberWithUnsignedLongLong:(unsigned long long)0];
}
This is the calling method which calls getSizeOfDirectory.
- (void)drawSequoiaField:(int)x y:(int)y xdelta:(int)xdelta
ydelta:(int)ydelta givenPath:(NSString*)givenPath
sizeOfParent:(unsigned long long)sizeOfParent
{
if([[NSFileManager defaultManager] fileExistsAtPath:givenPath])
{
NSArray *pathContents = [[NSFileManager defaultManager]
directoryContentsAtPath:givenPath];
NSString *dirContent,*completePath;
NSNumber *sizeOfChosenObject;
int i,xvalue,ratio;
xvalue=x;
for(i=0;i<[pathContents count];i++)
{
dirContent = [pathContents objectAtIndex:i];
completePath = [givenPath stringByAppendingString:dirContent];
sizeOfChosenObject = [self getSizeOfDirectory:completePath];
ratio = [sizeOfChosenObject unsignedLongLongValue] * xdelta /
sizeOfParent;
NSLog(completePath);
[self lockFocus];
[NSBezierPath strokeRect:NSMakeRect(xvalue,0,ratio,xdelta)];
[self unlockFocus];
xvalue=xvalue+ratio;
if([[[NSFileManager defaultManager] fileAttributesAtPath:[[givenPath
stringByAppendingString:dirContent] stringByAppendingString:@"/"]
traverseLink:NO]fileType]==NSFileTypeDirectory)
[self drawSequoiaField:xvalue
y:0
xdelta:0
ydelta:0
givenPath:[[givenPath stringByAppendingString:dirContent]
stringByAppendingString:@"/"]
sizeOfParent:[sizeOfChosenObject unsignedLongLongValue]];
}
}
}
Another smaller problem I have is a small memory leak I have in
getSizeOfDirectory or drawSequoiaField. I found this with MallocDebug,
but couldn't get the problem. Does anybody see it?
Is it right that every class that begins with a NS (like NSString,
NSNumber or NSArray) is already autoreleased?
Thanks for your help in advance
Dominik
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Cocoa-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/ email@hidden
This email sent to email@hidden
| References: | |
| >Determining the size of a directory Part 3 (From: Dominik Freyer <email@hidden>) | |
| >Re: Determining the size of a directory Part 3 (From: Finlay Dobbie <email@hidden>) |
| Home | Archives | FAQ | Terms/Conditions | Contact | RSS | Lists | About |
Visit the Apple Store online or at retail locations.
1-800-MY-APPLE
Contact Apple | Terms of Use | Privacy Policy
Copyright © 2007 Apple Inc. All rights reserved.