2013-05-19 2 views
3

Я пишу приложение, которое должно копировать файлы из сетевого каталога, в котором в данный момент исполняются файлы.Копирование исполняемых файлов с пути UNC

Я попытался открыть файл с

using (var source = new FileStream(fileData.FileName, 
            FileMode.Open, 
            FileAccess.Read, 
            FileShare.ReadWrite)) 

После того как я открыть файл потока я создаю еще один поток, чтобы скопировать в.

Однако это исключает исключение, что файл используется другим процессом. Я не уверен, как обойти эту проблему. Если я просто использую проводник файлов, он скопирует файлы в порядке. Поэтому я знаю, что это возможно, просто не знаю, как это сделать.

EDIT: Я также пробовал простой File.Copy(source, destination), и я получаю то же исключение, говоря, что файл используется другим процессом.

+0

Служба теневого копирования томов может помочь вам: http://www.codeproject.com/Articles/22745/Volume-Shadow-Copies-from-NET – k0stya

+0

Какая ОС является сетевым файловым сервером и клиентом, и вам нужно поддерживать любые другие версии ОС с обеих сторон? Я спрашиваю, как [SMB VSS] (http://technet.microsoft.com/en-us/library/jj612865.aspx) доступен в Windows 2012 и будет хорошим решением для вас. –

+0

Настройка - это однородная настройка сервиса с Windows Server 2008 на всех машинах. – btlog

ответ

0

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

  • Volume Shadow Copy
  • Microsoft Software Shadow Copy Provider

они могут быть оставлены в ручном запуске, так что они не должны работать все время.

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

Ссылка для скачивания: https://github.com/candera/hobocopy/downloads

Распакуйте файл и поместите их в папку Lib вашего проекта. Затем вызовите процесс, используя System.Diagnostics.Process. В вашем случае, просто используйте следующий параметр в качестве аргумента:/у (Не подскажете, просто скопировать все)

Синтаксис командной строки:

hobocopy [/statefile=FILE] [/verbosity=LEVEL] [ /full | /incremental ] 
    [ /clear ] [ /skipdenied ] [ /y ] [ /simulate ] [/recursive] 
    src dest [file [file [ ... ] ] 

C# код:

Process process = new Process(); 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.CreateNoWindow = true; 
process.StartInfo.FileName = @"Lib\hobocopy.exe"; 
process.StartInfo.Arguments = @" /y <network-directory> <local-directory> <filename>"; 
process.Start(); 

Это скопирует любые файлы (hobocopy фокусируется главным образом на эффективном копировании каталогов), который используется или не используется в вашем пункте назначения.

Смежные вопросы