Re: testing for file open state
Re: testing for file open state
- Subject: Re: testing for file open state
- From: Bryan Blackburn <email@hidden>
- Date: Sat, 30 Nov 2002 21:20:05 -0700
- Mail-followup-to: email@hidden
I think you want:
if ([fileManager fileExistsAtPath:[sourcePath stringByAppendingPathComponent:testFile] isDirectory:&isDir])
{
if( isDir )
{
// It's a directory
}
else
{
// We have a file
}
}
Also note your flock() should use bitwise or:
if (flock([testFileHandle fileDescriptor], (LOCK_EX | LOCK_NB)) < 0)
(note only one |), otherwise it's not doing what you think.
Bryan
On Nov 30, 2002 22:07, Alex Reynolds stated:
>
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.