All modern Filesystems work like Databases. As such they have Locks and Transactions. NTFS is a shining example of this.
You want to aquire a Write Lock on the file in addition to your read lock (or just a ReadWrite Lock). And then just only use the read one.
There can be multiple read locks, but only one write lock on any given file. In some cases anyone having a write lock can even exclude anyone else getting a read lock (and vice versa) - it can be nesseary to avoid file inconsistencies during reading. But that goes into deep implementation details.
Of course now the question becomes how well the other programm will deal with someone else locking the file. Technically you are supposed to handle that as any other Exogenous exception, but I am the first to admit that I might have skipped that code (and the retry one if nessesary) in some cases. Or the Multitasking for gracefull handling of a long lock aquisition time.
In either case, it might be best to release your lock ASAP. For such a purpose, it can be adviseable to just read the whole file into memory quickly and then work on the memory copy. How to go about that in .NET depends a lot on the filesize. The x32 Memory Limit and Object Limit are notorious for getting in the way with files in the GiB range.