Как скопировать файл, когда он используется другим процессом - PullRequest
29 голосов
/ 29 мая 2011

Можно ли скопировать файл, который одновременно используется другим процессом?

Я спрашиваю, потому что, когда я пытаюсь скопировать файл, используя следующий код, возникает исключение:

 System.IO.File.Copy(s, destFile, true);

Возникло исключение:

Процесс не может получить доступ к файлу 'D: \ temp \ 1000000045.zip', так как он используется другим процессом.

Я не хочу создавать новый файл, я просто хочу скопировать или удалить его.Это возможно?

Ответы [ 5 ]

34 голосов
/ 29 мая 2011

Пример (примечание: я только что объединил два результата Google, возможно, вам придется исправить незначительные ошибки;))

Важной частью является FileShare.ReadWrite при открытии FileStream.

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

using (var inputFile = new FileStream(
    "oldFile.txt",
    FileMode.Open,
    FileAccess.Read,
    FileShare.ReadWrite))
{
    using (var outputFile = new FileStream("newFile.txt", FileMode.Create))
    {
        var buffer = new byte[0x10000];
        int bytes;

        while ((bytes = inputFile.Read(buffer, 0, buffer.Length)) > 0)
        {
            outputFile.Write(buffer, 0, bytes);
        }
    }
}
9 голосов
/ 10 июля 2013

Чтобы создать копию файла, заблокированного для чтения и / или записи другим процессом в Windows, самое простое (и, вероятно, единственное) решение - использовать службу теневого копирования томов (VSS).

Служба теневого копирования томов сложна и трудна для вызова из управляемого кода.К счастью, некоторые замечательные парни создали библиотеку классов .NET для этого.Ознакомьтесь с проектом Alpha VSS в CodePlex: http://alphavss.codeplex.com.

EDIT

Как и во многих проектах CodePlex, Alpha VSS была перенесена на GitHub.Проект сейчас здесь: https://github.com/alphaleonis/AlphaVSS.

3 голосов
/ 30 мая 2011

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

[EDIT]
Самый простой способ выяснить процесс блокировки - использовать Process Explorer . Запустите его и введите имя файла в диалоговом окне Find->Find Handle or DLL.... В результатах поиска вы сможете увидеть, какой процесс блокирует ваш файл. Вы также можете сделать эту работу в C #, проверьте это: Какой процесс блокирует файл? . Также

0 голосов
/ 13 февраля 2018

Ну, другой вариант - скопировать заблокированный файл куда-нибудь, используя класс Process, и вызвать CMD, чтобы использовать команду «copy».В большинстве случаев команда «copy» сможет сделать копию файла, даже если он используется другим процессом, минуя проблему C # File.Copy.

Пример:

try
{
File.Copy(somefile)
}
catch (IOException e)
{
 if (e.Message.Contains("in use"))
                        {

                            Process.StartInfo.UseShellExecute = false;
                            Process.StartInfo.RedirectStandardOutput = true;                           
                            Process.StartInfo.FileName = "cmd.exe";
                            Process.StartInfo.Arguments = "/C copy \"" + yourlockedfile + "\" \"" + destination + "\"";
                            Process.Start();                            
                            Console.WriteLine(Process.StandardOutput.ReadToEnd());
                            Proess.WaitForExit();
                            Process.Close();                          
                        }
}

the try/catch should be added on top of your current try/catch to handle the file in use exception to allow your code to continue... 
0 голосов
/ 29 мая 2011

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

...