C как скопировать запущенный файл

от admin

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

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

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

Процесс не может получить доступ к файлу «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. . В результатах поиска вы сможете увидеть, какой процесс блокирует ваш файл. Вы также можете выполнить эту работу на С#, чтобы проверить это: Какой процесс блокирует файл?. Также

Читать:
P6100 процессор чем заменить

Ну, другой вариант — скопировать заблокированный файл куда-нибудь, используя класс 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, и потом ведь я могу их сравнить и удалить совпадения по дате изменения, и остануться те которые нужно будет скопировать&#8230 как указать копирование файлов и папок из листбокса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&#8243 а как указать вместо 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 имеет флаг, который позволяет открывать файл в режиме совместного использования. Этот флаг по определению должен решить вашу проблему.

Related Posts