//--------------------------------------------------------------- // Copy File, not only data but also attributes ;-) //--------------------------------------------------------------- void TJerFile::CopyFile( const char *sourcepath, const char *destinationpath ) { BFile *source = 0L, *destination = 0L; entry_ref ref; uint8 data[2048]; int32 len = 2048; char buf[B_ATTR_NAME_LENGTH]; void *buffer = NULL; int32 lengthR,lengthW; attr_info attribute; BEntry entry( sourcepath ); if( B_OK == entry.InitCheck() ) { if( B_OK == entry.GetRef( &ref ) ) { source = new BFile( &ref ,B_READ_ONLY); } else { string truc("Error opening file in read only mode: "); truc = truc + sourcepath; GeneralException excep(truc.c_str(),"BJerFile::CopyFile"); throw(excep); } } else { string truc("Error constructing file object: "); truc = truc + sourcepath; GeneralException excep(truc.c_str(),"BJerFile::CopyFile"); throw(excep); } entry.SetTo( destinationpath ); if( B_OK == entry.InitCheck() ) { if( B_OK == entry.GetRef( &ref ) ) { destination = new BFile( &ref ,B_READ_WRITE | B_CREATE_FILE | B_ERASE_FILE); } else { string truc("Error opening file in read write mode: "); truc = truc + destinationpath; GeneralException excep(truc.c_str(),"BJerFile::CopyFile"); throw(excep); } } else { string truc("Error destination constructing file object: "); truc = truc + destinationpath; GeneralException excep(truc.c_str(),"BJerFile::CopyFile"); throw(excep); } if( source && destination ) { BMessage *AMessage; AMessage = new BMessage(B_UPDATE_STATUS_BAR); AMessage->AddFloat("delta",1.0); AMessage->AddString("text","Copy..."); AMessage->AddString("trailingtext",destinationpath); MyInvoker.Invoke(AMessage); delete AMessage; while (source->GetNextAttrName(buf) == B_NO_ERROR) { source->GetAttrInfo(buf,&attribute); if (buffer!=NULL) { free(buffer); } buffer = (void *)malloc(sizeof(char)*(attribute.size +1)); lengthR = source->ReadAttr(buf,attribute.type,0,buffer,attribute.size); lengthW = destination->WriteAttr(buf,attribute.type,0,buffer,lengthR); if (lengthR!=lengthW) { string truc("Error copying attribute for file : "); truc = truc + destinationpath; GeneralException excep(truc.c_str(),"BJerFile::CopyFile"); throw(excep); } switch(lengthR) { case B_ENTRY_NOT_FOUND: { GeneralException excep("The attribute doesn't exist.","BJerFile::CopyFile"); throw(excep); break; } case B_FILE_ERROR : { GeneralException excep2("The object is uninitialized.","BJerFile::CopyFile"); throw(excep2); break; } } switch(lengthW) { case B_FILE_ERROR : { GeneralException excep3("This object is a read-only BFile.","BJerFile::CopyFile"); throw(excep3); break; } case B_NOT_ALLOWED : { GeneralException excep4("The node is on a read-only volume.","BJerFile::CopyFile"); throw(excep4); break; } case B_DEVICE_FULL : { GeneralException excep5("Out of disk space.","BJerFile::CopyFile"); throw(excep5); break; } case B_NO_MEMORY : { GeneralException excep6("Not enough memory.","BJerFile::CopyFile"); throw(excep6); break; } } } for( ;; ) { len = source->Read( data, len ); if( len == 0 ) break; destination->Write( data, len ); if( len != 2048 ) break; } //---------- freeing some resources... delete source; delete destination; } }