If all you're doing is copying a file, you should actually use std::fs::copy because it copies a lot more than just the contents, including permissions and NTFS file streams. Also it can be significantly faster (in particular on Windows).
Two points that aren't relevant when using the proper functions, but nevertheless:
for arbitary files, don't read them into a string (it requires UTF-8), instead use read_to_end into a Vec
instead of using why.description() format just why which should give you a more detailed error message (Error::description(), because it has to return a string slice, is kind of a last resort for when you don't want to call code that may allocate).