For those with the same issue looking for a quick hack on 3.4.x, you can go into src/dvr/dvr_db.c and find dvr_entry_delete(), then at the end of the function, comment out dvr_entry_remove().
This will still remove recording files when you tell it to, but leave the log in the dvr/log directory for normal expiration after X days (whatever you have set). You will no longer have to worry about recording the same re-run every time you delete it.
On the downside, the completed items will show up as "Failed" after you delete the recordings, but that's the downside for a one-line hack, I guess.
Edit: If you want to get a little cleaner, you can make a copy of dvr_entry_remove() as dvr_entry_remove_leave_file() and just take out the call to hts_settings_remove(), and update the call in dvr_entry_delete() to it.