+ ( Nsstring * ) Filemd5 : ( Nsstring * ) Path { Nsfilehandle * Handle= [ Nsfilehandle Filehandleforreadingatpath : Path ] ;If ( Handle = Nil ) Return @"Error getting file MD5" ; // File didnt exist Cc_md5_ctx MD5; cc_md5_init ( & MD5 ) ; Bool Done = No ; While ( ! Done ) { Nsdata * Filedata = [ Handle Readdataoflength : Chunk_size] ; Cc_md5_update ( & MD5, [ Filedata Bytes ] ,[ Filedata Length ] ) ; If ( [ Filedata Length ] = 0 ) Done = Yes ; } Unsigned Char Digest [ Cc_md5_digest_length ] ; Cc_md5_final( Digest, & MD5 ) ; Nsstring * S = [ Nsstring Stringwithformat : @ "% 02x % 02x % 02x % 02x % 02x % 02x % 02x % 02x % 02x % 02x % 02x % 02x % 02x % 02x % 02x % 02x" , Digest [ 0 ] , Digest [ 1 ] , Digest [ 2 ] , Digest [ 3 ] , Digest [ 4 ] , Digest [ 5 ] , Digest [ 6 ] , Digest [ 7 ] , Digest [ 8 ] , Digest [ 9 ] , Digest [ 10 ] , Digest [ 11 ] , Digest [ 12 ] , Digest [ 13 ] , Digest [ 14 ] , Digest [ 15 ] ] ; Return S;}