void FileList::ListMissingOrChangedFiles(const char *applicationDirectory, FileList *missingOrChangedFiles, bool alwaysWriteHash, bool neverWriteHash) { unsigned fileLength; // CSHA1 sha1; FILE *fp; char fullPath[512]; unsigned i; // char *fileData; for (i=0; i < fileList.Size(); i++) { strcpy(fullPath, applicationDirectory); FixEndingSlash(fullPath); strcat(fullPath,fileList[i].filename); fp=fopen(fullPath, "rb"); if (fp==0) { missingOrChangedFiles->AddFile(fileList[i].filename, fileList[i].fullPathToFile, 0, 0, 0, FileListNodeContext(0,0), false); } else { fseek(fp, 0, SEEK_END); fileLength = ftell(fp); fseek(fp, 0, SEEK_SET); if (fileLength != fileList[i].fileLengthBytes && alwaysWriteHash==false) { missingOrChangedFiles->AddFile(fileList[i].filename, fileList[i].fullPathToFile, 0, 0, fileLength, FileListNodeContext(0,0), false); } else { // fileData= (char*) rakMalloc_Ex( fileLength, __FILE__, __LINE__ ); // fread(fileData, fileLength, 1, fp); // sha1.Reset(); // sha1.Update( ( unsigned char* ) fileData, fileLength ); // sha1.Final(); // rakFree_Ex(fileData, __FILE__, __LINE__ ); unsigned int hash = SuperFastHashFilePtr(fp); if (RakNet::BitStream::DoEndianSwap()) RakNet::BitStream::ReverseBytesInPlace((unsigned char*) &hash, sizeof(hash)); //if (fileLength != fileList[i].fileLength || memcmp( sha1.GetHash(), fileList[i].data, HASH_LENGTH)!=0) if (fileLength != fileList[i].fileLengthBytes || memcmp( &hash, fileList[i].data, HASH_LENGTH)!=0) { if (neverWriteHash==false) // missingOrChangedFiles->AddFile((const char*)fileList[i].filename, (const char*)sha1.GetHash(), HASH_LENGTH, fileLength, 0); missingOrChangedFiles->AddFile((const char*)fileList[i].filename, (const char*)fileList[i].fullPathToFile, (const char *) &hash, HASH_LENGTH, fileLength, FileListNodeContext(0,0), false); else missingOrChangedFiles->AddFile((const char*)fileList[i].filename, (const char*)fileList[i].fullPathToFile, 0, 0, fileLength, FileListNodeContext(0,0), false); } } fclose(fp); } } }
unsigned int SuperFastHashFile(const char * filename) { FILE *fp = fopen(filename, "rb"); if (fp == 0) return 0; unsigned int hash = SuperFastHashFilePtr(fp); fclose(fp); return hash; }
uint32_t SuperFastHashFile (const char * filename) { FILE *fp; if (fopen_s(&fp, filename, "rb")!=0) return 0; uint32_t hash = SuperFastHashFilePtr(fp); fclose(fp); return hash; }