There are two sources of exception message text. First are string resources in mscorlib.dll, the second is text generated by Windows itself with the FormatMessage() API. The error code for your example is 183, ERROR_ALREADY_EXISTS
. Mscorlib.dll does contain a dedicated string resource for that error:
IO.IO_AlreadyExists_Name=Cannot create "{0}" because a file or directory with the same name already exists.
No linefeed in that message. The code that generates the exception message (System.IO.WinIOError) first checks if there's a meaningful file name to generate for the {0} composite formatting argument. Apparently that fails in your program, that's a bit odd. The fallback is the Windows error message produced by FormatMessage() and it's not quite formatted the same way as the resource strings as you found it.
It could be argued that this is a bug, you could report it at connect.microsoft.com. The odds that this will get fixed are zero though. There's some soul out there that is parsing the Message property, especially since this is an IOException. Trimming like you did is a good workaround.