I am trying to copy a file using NSFilemanagers copyPath:toPath:handler: method.

The (Tiger) documentation says: "File or directory attributes—that is, metadata such as owner and group numbers, file permissions, and modification date—are also copied."

Well, the attributeModDate is not.

So I had a look at the File Manager Reference and found FSSetCatalogInfo. It said about kFSCatInfoAttrMod: "Retrieve or set the date that an attribute or named fork was last modified."

I tried it and nothing happened. No error message. But no change of attributeModDate either.

Here is the code:

#import <Foundation/Foundation.h>

NSDate *dateFromUTCDateTime( const UTCDateTime *f );

int main (int argc, const char * argv[])
{
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
        NSProcessInfo *processInfo = [ NSProcessInfo processInfo ];
        NSArray *arguments = [ processInfo arguments ];
        NSString *lastFileTo = [ arguments objectAtIndex: 1 ];
                
        OSStatus status;
        FSRef fileFsRefTo;
const UInt8 *patHTo = (const UInt8 *)[ lastFileTo fileSystemRepresentation ];
        status = FSPathMakeRefWithOptions       (       patHTo,
                                                                                
        kFSPathMakeRefDoNotFollowLeafSymlink,
                                                                                    
    &fileFsRefTo,
                                                                                
        NULL
                                                                                
);
        if ( status != noErr ) return 2;
        
FSCatalogInfoBitmap whichInfo = kFSCatInfoAttrMod; // attributes modification date
        FSCatalogInfo catalogInfo;      

        OSErr resul1;
resul1 = FSGetCatalogInfo( &fileFsRefTo, whichInfo, &catalogInfo, NULL, NULL, NULL);
        if ( resul1 != noErr ) return 3;

        NSDate *p1 = dateFromUTCDateTime( &catalogInfo.attributeModDate );
NSLog(@"%s got old changeDate on \"[EMAIL PROTECTED]" as %@", __FUNCTION__, lastFileTo, p1 );

        catalogInfo.attributeModDate.highSeconds        = 0;
        catalogInfo.attributeModDate.lowSeconds         = 0xf0000000;
        catalogInfo.attributeModDate.fraction           = 0;
        
        resul1 = FSSetCatalogInfo( &fileFsRefTo, whichInfo, &catalogInfo );
        if ( resul1 != noErr ) return 4;
                        
        NSDate *p2 = dateFromUTCDateTime( &catalogInfo.attributeModDate );
NSLog(@"%s did set changeDate on \"[EMAIL PROTECTED]" to %@", __FUNCTION__, lastFileTo, p2 );

resul1 = FSGetCatalogInfo( &fileFsRefTo, whichInfo, &catalogInfo, NULL, NULL, NULL);
        if ( resul1 != noErr )return 5;

        NSDate *p3 = dateFromUTCDateTime( &catalogInfo.attributeModDate );
NSLog(@"%s got new changeDate on \"[EMAIL PROTECTED]" as %@", __FUNCTION__, lastFileTo, p3 );

        [pool release];
        return 0;
}

NSDate *dateFromUTCDateTime( const UTCDateTime *ff )
{
        CFAbsoluteTime oCFTime;
        OSStatus ko = UCConvertUTCDateTimeToCFAbsoluteTime ( ff, &oCFTime );
        if ( ko != noErr ) return nil;
NSDate *gy = [ NSDate dateWithTimeIntervalSinceReferenceDate: oCFTime ];
        return gy;
}

Result:
        got old changeDate on "/tmp/a" as 2008-09-15 13:25:14 +0700
        did set changeDate on "/tmp/a" to 2031-08-05 16:04:00 +0700
        got new changeDate on "/tmp/a" as 2008-09-15 13:25:14 +0700
ChangeDate has exited with status 0.

So what did I do wrong? Tested on Tiger 10.4.11.


Kind regards,

Gerriet.

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to