Перезапись заблокированных файлов с помощью Move, а затем Copy. - PullRequest
2 голосов
/ 01 апреля 2011

Я пытаюсь написать программу, которая будет использоваться для применения обновлений к приложению.Из-за особенностей приложения некоторые файлы будут заблокированы (главным образом IIS) и не могут быть перезаписаны с помощью File.Copy(target).При выполнении задачи вручную наша служба поддержки часто копирует файлы с помощью проводника Windows, который разблокирует файл, позволяя им скопировать новый файл.

Почему это работает при работе с Windows Explorer и почему происходит сбойтак печально, когда вы делаете это в коде?

Код, который я использую, примерно такой:

File.Move( target, tempPath )
File.Copy( source, target )

С модульным тестом, который открывает и блокирует файл, который вы затем пытаетесь перезаписать:

var source = "c:\\source.txt";
var target = "c:\\target.txt";
var temp = "c:\\temp\\fake-target.txt";

using ( var lockedFile = System.IO.File.OpenWrite( target ) ) {
    File.Move( target, temp )
    File.Copy( source, target )
}

Любые предложения будут великолепны.Спасибо за вашу помощь.

Ответы [ 3 ]

2 голосов
/ 01 апреля 2011

Обратите внимание, что ваше temp имя файла недопустимо, отсутствует дополнительная обратная косая черта.

Переименование используемых файлов работает для файлов, для которых создан файл с отображением в памяти. Как файлы .exe и .dll, которые загружаются в процессе. Он не работает для файлов, которые вы открываете с помощью FileStream. Это было бы довольно плохо, Windows не сможет обновлять метаданные для файла, когда файл закрыт. Как размер файла и дата последнего написания.

Это должно быть достаточно для применения обновлений, ваш фрагмент кода просто недостаточно хорошо эмулирует ту же операцию.

2 голосов
/ 01 апреля 2011

Вы не можете перемещать заблокированные файлы ни в приложении, ни в проводнике Windows. Обычный способ выполнить обновление во время работы программного обеспечения - записать все во временные файлы (например, program.exe.temp). После завершения обновления вы выходите из приложения, заменяете все исходные файлы временными файлами (возможно, с помощью небольшой программы обновления) и перезапускаете приложение. Таким образом, вы также можете отменить процесс обновления (до последнего шага), не вмешиваясь в установленную версию.

1 голос
/ 01 апреля 2011

Обратите внимание, что где вы находитесь, имеет значение. Вы можете сойти с рук на месте, но не удаленно. Не все ОС также позволяют это.

...