Ответ 1
Похоже, что другой процесс открывал файл с использованием API-интерфейсов сопоставления файлов (shared memory).
Функция поиска в Process Explorer должна быть в состоянии сказать вам.
При записи в файл XML я получил очень странное IOException:
System.IO.IOException: The requested operation cannot be performed on a file with a user-mapped section open.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
at System.Xml.XmlTextWriter..ctor(String filename, Encoding encoding)
at System.Xml.XmlDocument.Save(String filename)
Ошибка произошла, когда я вызвал функцию XmlDocument Save (string).
Любые идеи о том, что произошло?
Похоже, что другой процесс открывал файл с использованием API-интерфейсов сопоставления файлов (shared memory).
Функция поиска в Process Explorer должна быть в состоянии сказать вам.
Похоже, файл, который вы пытаетесь написать, уже открыт в другом месте, либо вашим кодом, либо другим процессом.
У вас есть файл, открытый в редакторе? У вас есть другой код, который его читает, но забывает закрыть его?
Вы можете использовать Process Explorer, чтобы узнать, какой процесс имеет открытый дескриптор файла на нем - используйте команду Find
/Find handle or DLL...
.
Попробуйте исключить файл из проекта во время отладки. Я обнаружил, что на самом деле VS2010 содержал XML файл. Затем вы можете выбрать "Показать все файлы" в своем браузере решений, чтобы проверить отладку сообщения файла XML.
Блокировка остановит проблему при выполнении нескольких операций записи.
lock(file){ write to file code here }
ОС или Framework могут вывести вас из строя, если вы попытаетесь открыть один и тот же файл снова и снова в узком цикле, например
while (true) {
File.WriteAllLines(...)
}
Конечно, вы не хотите этого делать. Но ошибка в коде может привести к тому, что это произойдет. Ошибка связана не с кодом, а с Windows или .NET Framework.
Если вам нужно очень быстро написать много файлов, вы можете добавить небольшую задержку с помощью Thread.Sleep(), которая также, похоже, отключает ОС.
while (i++<100000000) {
File.WriteAllLines(...)
Thread.Sleep(1);
}