Mailing Lists: Apple Mailing Lists

Image of Mac OS face in stamp
 
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

re: testing for file open state



On Saturday, November 30, 2002, at 12:51 PM, Chris Ridd wrote:

Your code basically works for me... Except I'd suggest constructing the
filename to open using [sourcePath stringByAppendingPathComponent:
testFile], and I'd make sure I sent closeFile to the NSFileHandle before
looping/returning otherwise I'd run out of file descriptors.

You should ensure testFile is a file and not a directory as probably won't
be able to open directories that way (POSIX has different calls to open a
directory and to open a file), and you certainly won't be able to lock them
even if you could. (Use NSFileManager -fileExistsAtPath:isDirectory:)

Library calls typically only set errno when they fail, so you should set
errno to 0 yourself to avoid false errors.

Here's my revised code:

// start recursive check of sourcePath for open file
NSString *testFile;
NSDirectoryEnumerator *testEnumerator = [fileManager enumeratorAtPath:sourcePath];

while (testFile = [testEnumerator nextObject])
{
if (![fileManager fileExistsAtPath:[sourcePath stringByAppendingPathComponent:testFile] isDirectory:&isDir])
{
NSLog (@"Examining %@", [sourcePath stringByAppendingPathComponent:testFile]);
// build NSFileHandle to get file descriptor of testedFile
NSFileHandle *testFileHandle = [NSFileHandle fileHandleForUpdatingAtPath:[sourcePath stringByAppendingPathComponent:testFile]];
NSLog (@"%d", [testFileHandle fileDescriptor]);

// reset errno
errno = 0;

// use file descriptor and flock() to test whether file is open
if (flock([testFileHandle fileDescriptor], (LOCK_EX || LOCK_NB)) < 0)
{
// if a file is open, "return YES;"
NSLog (@"%@ on file %@", [NSString stringWithCString:strerror(errno)], testFile);
}
else
{
NSLog (@"Could not find error with flock() on %@", testFile);
}
[testFileHandle closeFile];
}
else
{
NSLog (@"%@ is a directory", [sourcePath stringByAppendingPathComponent:testFile]);
return NO;
}
}

Now the problem has worsened, in that every file at [sourcePath stringByAppendingPathComponent:testFile] is now a directory!

For example, here are results that I get back via NSLog:

2002-11-30 22:04:06.414 Ramallama[18762] /Volumes/Alex/.Trashes is a directory
2002-11-30 22:04:06.414 Ramallama[18762] /Volumes/Alex/AEGGrant.html is a directory
2002-11-30 22:04:06.415 Ramallama[18762] /Volumes/Alex/Alex's Presentation.ppt is a directory
2002-11-30 22:04:06.415 Ramallama[18762] /Volumes/Alex/Desktop DB is a directory
2002-11-30 22:04:06.415 Ramallama[18762] /Volumes/Alex/Desktop DF is a directory

Of all of these, only /Volumes/Alex/.Trashes is really a directory. The rest are files.

Is there is a bug with stringByAppendingPathComponent or with -(BOOL) fileExistsAtPath: isDirectory:?

I've been looking over the logic again and again and I can't see what is wrong with this call. This is getting very frustrating...

-Alex
_______________________________________________
cocoa-dev mailing list | email@hidden
Help/Unsubscribe/Archives: http://www.lists.apple.com/mailman/listinfo/cocoa-dev
Do not post admin requests to the list. They will be ignored.



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.