Как скопировать файл, пока он используется другим процессом
Можно ли скопировать файл, который одновременно используется другим процессом?
Я спрашиваю, потому что, когда я пытаюсь скопировать файл, используя следующий код, возникает исключение:
Процесс не может получить доступ к файлу «D: \ temp \ 1000000045.zip», потому что он используется другим процессом.
Я не хочу создавать новый файл, я просто хочу его скопировать или удалить. Это возможно?
задан 29 мая ’11, 07:05
Этот файл заблокирован вашим приложением? — Anton Semenov
Я не знаю, что это заблокировано моим приложением или нет, потому что я создаю zip-файл, используя ссылку ICSharpCode.SharpZipLib.Zip после zip, я копирую его и экспортирую, и после экспорта, когда я снова хочу удалить этот файл, он показывает исключение. — Vir
7 ответы
Пример (примечание: я только что объединил два результата Google, возможно, вам придется исправить мелкие ошибки;))
Важная часть — это FileShare.ReadWrite при открытии FileStream.
Я использую аналогичный код для открытия и чтения документов Excel, пока Excel все еще открыт и блокирует файл.
ответ дан 10 апр.
Хотя вы правы в своем подходе, не всегда можно прочитать файлы, заблокированные другими процессами; как упоминает GolezTrol, некоторые файлы также заблокированы для чтения. Но ваше описание тем не менее правильный подход и заслуживает поддержки. Если вам удастся прочитать, скажем, прикрепленные файлы данных ms sql с помощью .NET, я был бы рад узнать, как вы это делаете. — фейстер
Почему нет inputFile.CopyTo(outputFile, 0x10000); ? — Марсель Попеску
Это не сработало при копировании файла, открытого в данный момент MS Word. — Аривибава
Чтобы создать копию файла, который заблокирован для чтения и / или записи другим процессом в Windows, самым простым (и, вероятно, единственным) решением является использование службы теневого копирования томов (VSS).
Служба теневого копирования томов сложна, и ее трудно вызвать из управляемого кода. К счастью, некоторые прекрасные ребята создали для этого библиотеку классов .NET. Посмотрите проект Alpha VSS на CodePlex: http://alphavss.codeplex.com.
РЕДАКТИРОВАТЬ
Как и многие другие проекты на CodePlex, Alpha VSS перешла на GitHub. Проект сейчас здесь: https://github.com/alphaleonis/AlphaVSS.

Что ж, другой вариант — скопировать заблокированный файл куда-нибудь с помощью класса Process и вызвать CMD для использования команды «копировать». В большинстве случаев команда «copy» сможет сделать копию файла, даже если он используется другим процессом, минуя проблему C # File.Copy.
Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и / или как этот код отвечает на вопрос. — cСтойслофф
Использование команды копирования работало для файла, все еще открытого MS Word. — Аривибава
Вам следует изучить и выяснить, какой процесс блокирует файл. Если это не ваш процесс, у вас нет способа решить проблему. Конечно, вы можете применить некоторые хаки и вручную снять блокировку файла, но, скорее всего, такой подход приведет к неожиданным последствиям. Если процесс принадлежит вам, попробуйте разблокировать файл или заблокировать его с помощью общего доступа для чтения.
[РЕДАКТИРОВАТЬ]
Самый простой способ узнать процесс блокировки — использовать Process Explorer.Запустите его и введите имя файла в Find->Find Handle or DLL. чат. В результатах поиска вы сможете увидеть, какой процесс блокирует ваш файл. Вы также можете выполнить эту работу на C #, проверьте это: Какой процесс блокирует файл?, Также
ответ дан 23 мая ’17, 13:05

Метод CopyTo FileInfo копирует существующий файл в новый файл, позволяя перезаписать существующий файл. Поэтому это не мешает процессу работы с существующим файлом.
ответ дан 25 мая ’21, 20:05
Спасибо за это. Я использовал метод из другого вопроса, чтобы проверить, был ли файл заблокирован, и он зависал, вызывая множество проблем. Избавиться от этого и просто использовать CopyTo пока работает. — Дейв Джонсон
Нет, не можешь. Некоторые программы не блокируют файл для чтения, но если они это сделают, вы не сможете получить доступ к файлу, не завершив работу другой программы.
ответ дан 29 мая ’11, 11:05

На самом деле вы можете в NTFS, именно так все программы резервного копирования могут создавать резервные копии открытых файлов. Все они используют ведение журнала для обнаружения изменений, VSS для чтения файлов, которые все еще открыты, а иногда и транзакции для обеспечения резервного копирования только согласованных файлов. — Панайотис Канавос
@PanagiotisKanavos Я не думаю, что это общеизвестно. Если бы вы могли уточнить это в ответе, вы бы очень обрадовали меня, OP и, вероятно, многих других. — ГолезТрол
Как скопировать файл, когда он используется другим процессом
Можно ли одновременно копировать файл, который используется другим процессом?
Я спрашиваю, потому что, когда я пытаюсь скопировать файл, используя следующий код, возникает исключение:
Процесс не может получить доступ к файлу «D:\temp\1000000045.zip», потому что он используется другим процессом.
Я не хочу создавать новый файл, просто хочу скопировать его или удалить. Возможно ли это?
5 ответов
Пример (примечание: я только что объединил два результата Google, возможно, вам придется исправить незначительные ошибки;))
Важной частью является FileShare.ReadWrite при открытии FileStream.
Я использую аналогичный код для открытия и чтения документов Excel, в то время как Excel все еще открыт и блокирует файл.
Чтобы создать копию файла, который read- и/или заблокирован для записи другим процессом в Windows, самое простое (и, вероятно, единственное) решение состоит в том, чтобы использовать службу теневого копирования томов (VSS).
Служба теневого копирования томов сложна и трудна для вызова из управляемого кода. К счастью, некоторые замечательные парни создали библиотеку классов .NET для этого. Ознакомьтесь с проектом Alpha VSS на CodePlex: http://alphavss.codeplex.com.
РЕДАКТИРОВАТЬ
Как и во многих проектах CodePlex, Alpha VSS перешла на GitHub. Проект сейчас здесь: https://github.com/alphaleonis/AlphaVSS.
Вам следует изучить и выяснить, какой процесс блокирует файл. Если этот процесс не является вашим, у вас нет способа решить проблему. Конечно, вы можете применить некоторые хаки и вручную заблокировать блокировку файлов, но, скорее всего, этот подход приведет к непредсказуемым последствиям. Если процесс принадлежит вам, попробуйте разблокировать файл или заблокировать его с доступом к общедоступному доступу.
[EDIT]
Самый простой способ обнаружить процесс блокировки — использовать Process Explorer. Запустить его и ввести имя файла в диалоговом окне Find->Find Handle or DLL. . В результатах поиска вы сможете увидеть, какой процесс блокирует ваш файл. Вы также можете выполнить эту работу на С#, чтобы проверить это: Какой процесс блокирует файл?. Также
Ну, другой вариант — скопировать заблокированный файл куда-нибудь, используя класс Process, и вызвать CMD, чтобы использовать команду «copy». В большинстве случаев команда «copy» сможет сделать копию файла, даже если он используется другим процессом, минуя проблему С# File.Copy.
Нет, вы не можете. Некоторые программы не будут блокировать файл для чтения, но если это так, вы не можете попасть в файл, не убивая другую программу.
Статья Как скопировать файл с помощью языка C#?
Для работы мы используем класс File и метод Copy, в который в качестве первого параметра, передаём полный путь к файлу, который необходимо скопировать. Вторым параметров указываем, куда мы копируем файл. Третий, необязательный параметр, который имеет тип bool, позволяет определить действие, которое нужно выполнить, если в папке dir2 уже содержится файл (2.txt). Например, если установить значение true, то тогда при копировании файла (1.txt), файл (2.txt) будет перезаписан, если же мы установим значение false, то в таком случае получим выброс исключения, так как файл уже существует, а его изменение (перезапись) мы запретили.
Так же не забывайте при работе с пространством имён System.IO использовать блоки try catch.
Сначала с помощью метода GetFiles, используя маску (*.*), получаем все файлы в папке Dir1, а затем по очереди копируем их. Если Вам необходимо скопировать все файлы только какого-то определенного типа, например все текстовые файлы (.txt), то тогда указываем маску (*.txt), для mp3 файлов (*.mp3) и так далее. Значение true указываем в том случаи, если требуется перезаписать старые файлы в папке Dir2.
САНЯ
24.08.2016 в 09:37
хм, к примеру я получил список файлов в папке и подпапках с датой изменения
а как теперь скопировать все файлы к примеру в c:1 и потом через некоторе время скопировать файлы которые изменились?
ADMIN
25.08.2016 в 06:15
«а как теперь скопировать все файлы к примеру в c:1»
и потом через некоторе время скопировать файлы которые изменились?
Например, можно добавить таймер и запускать его сразу после первого копирования.
пару вопросов, что не задал сразу, сорри!
этим кодом я копирую файлы в папке 2, но в ней есть подпапки, а как скопировать все папки со всеми файлами? список папок и файлов я получаю в приведенным мной кодом выше, так же я получаю дату изменения, к примеру я первый раз сразу копирую все папки и файлы из 2, а потом будет работать таймер по которому будет копирование измененых файлов. Точнее я же получаю список файлов и папок в листбокс1, это к примеру, при запуске программы и сразу их копирую, а потом работает таймер, где я уже вывожу список папок и файлов листбокс2, и потом ведь я могу их сравнить и удалить совпадения по дате изменения, и остануться те которые нужно будет скопировать… как указать копирование файлов и папок из листбокса1, при запуске и листбокс2 по таймеру?))))
ADMIN
27.08.2016 в 14:49
как скопировать все папки со всеми файлами
можно использовать рекурсию, например:
как указать копирование файлов и папок из листбокса1, при запуске и листбокс2 по таймеру?))))
САНЯ
27.08.2016 в 23:58
если честно, то у меня ничего не выходит, что то я совсем запутался вот полный листинг кода, задача получить все файлы и папки с подпапками в с:2 вывести листбокс1, потом скопировать в c:1, а там уже сам))
[cut]
подскажи, а как сделать перезапись файл — этот метод запрещает это сделать? и такой если файл будет открыт, он скопируеться?
ADMIN
31.08.2016 в 16:29
подскажи, а как сделать перезапись файл — этот метод запрещает это сделать?»
Ответ на этот вопрос есть в статье.
если файл будет открыт, он скопируеться?
Да, но лучше всё равно обработать возможность возникновения System.IO.IOException
САНЯ
31.08.2016 в 19:51
админ, я использую CopyDir(@»C:2″, @»C:1″ а как указать вместо c:2 список папок в листбокс? пробывал пару вариантов, но видать не правильно
САНЯ
02.09.2016 в 19:39
админ, новерно крайний вопрос)) в листбокс файл + дата изменения, скопировать как не получаеться и оно понятно, а как отделить при копировании дату изменения до пробела
ADMIN
04.09.2016 в 04:44
Получить только путь из строки?
САНЯ
05.09.2016 в 05:30
Админ а что не правильно, пытаюсь удалить совпадение строк? удаляет только первую
ADMIN
06.09.2016 в 03:32
Поставь точку остановы и посмотри, что происходит со списком listbox1 до удаления элемента и после.
САНЯ
07.09.2016 в 01:14
по идее должны быть так? переменные обьявлены в классе, я понимаю что это должно быть просто, но что то совсем не могу вникнуть…. очень хочу научится , но самоучкой трудно((
САНЯ
09.09.2016 в 01:31
админ привет, подскажи что не так? после удаления сравнений, в листбоксе2 остаеться к примеру путь с:22.txt 11.11.11 11:11 но при использовании ниже приведенного кода, выдаёт ошибку!
ADMIN
10.09.2016 в 07:27
выдаёт ошибку
САНЯ
11.09.2016 в 09:21
решил попробывать вставить рекурсию по нажатию кнопки
Необработанное исключение типа «System.InvalidOperationException» в System.Windows.Forms.dll
Дополнительные сведения: Список, к которому привязан данный перечислитель, был изменен. Перечислитель может использоваться, только если список не изменяется.
как скопировать уже открытый файл?
Я хотел бы скопировать этот файл. Как это сделать? Я хотел бы сделать что-то вроде этого:
Я знаю, что есть CopyFile(fileName, newFileName) функция, но кажется, что мне придется закрыть свой дескриптор перед использованием этого вызова этой функции. Есть ли другой способ сделать копию?
Решение
Я думаю, вы работаете в Windows. Проблема в том, что в Windows, когда вы открываете файл, он по умолчанию блокируется для других открытий (Копировать также открывает файл). Как я знаю, CreateFile имеет флаг, который позволяет открывать файл в режиме совместного использования. Этот флаг по определению должен решить вашу проблему.