Подключиться к API копирования файлов Windows из C#

Есть ли способ подключиться к API копирования файлов Windows с С#? Я знаю, что для этого потребуется неуправляемый код, но пример кода или стартер был бы полезен. Я уже видел код C++, но он весь греческий.

ОБНОВЛЕНИЕ: приношу свои извинения, я должен был более четко изложить свои намерения. Я хочу на самом деле изменить функцию копирования Windows, чтобы она была более жесткой (например, разрешить постановку в очередь, планирование, обработку перезапусков, пауз и т. д.). Когда я сказал хук, я имел в виду хук API, чтобы, когда кто-то запускает копию, я получал источники и места назначения и мог обрабатывать это по своему желанию. Я старая школа и часто использовал API Mac OS, чтобы делать эти вещи, поэтому я предположил, что в мире С++ WINAPI есть какой-то тип эквивалента.


person Keith Adler    schedule 19.10.2009    source источник
comment
Любая причина, по которой System.IO.File.Copy(System.String sourceFileName, System.String destFileName, перезапись System.Boolean) недостаточна?   -  person Yoopergeek    schedule 19.10.2009
comment
Я предполагаю, что вы хотите сделать это из-за скорости? , нет другой причины не использовать копию управляемого файла, на самом деле я почти уверен, что если бы вы провели некоторые тесты, вы бы нашли их очень близкими. .Net чертовски хорошо оптимизирует код при переходе на уровень IL.   -  person RC1140    schedule 19.10.2009


Ответы (5)


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

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

person peterchen    schedule 19.10.2009
comment
Это хороший момент, который я не учел. Я не могу дождаться, пока WIN32 получит собственную виртуальную машину WOW, а CLR станет основным API де-факто. До тех пор мне просто нужно сделать это на C++. Спасибо. - person Keith Adler; 19.10.2009
comment
Любые мысли о .NET native по этому вопросу? - person Caramiriel; 11.09.2016

Обновление: как уже говорили другие, почему бы просто не использовать System.IO.File.Copy(...)? Он вызывает тот же базовый API. Как указывает Майкл Г., возможно, вы намереваетесь вызвать FileCopyEx API, который позволяет вам перехватывать обратные вызовы с индикацией прогресса (???). Это действительно единственная причина для P/Invoke файлового копирования в .NET. Подробности о том, как реализовать FileCopyEx, можно найти здесь: http://pinvoke.net/default.aspx/kernel32/CopyFileEx.html

Исходный ответ: (который вам действительно не следует использовать...)

Фрагмент кода удален, потому что вам действительно не следует его использовать... Если вы одержимы созданием взломанного кода, вы можете узнать, как его использовать, по адресу: http://pinvoke.net/default.aspx/kernel32/CopyFile.html

person Yoopergeek    schedule 19.10.2009
comment
я бы не сказал -1, но технически это то же самое, что и вызов управляемого кода без преимуществ управляемого кода, и пользователь запросил неуправляемый код - person RC1140; 19.10.2009
comment
Вопрос был: Как перехватить файл-копию Windows API. Не причины использовать System.IO.File.Copy. Комментарии к вопросу должны указывать на то, что System.IO.File.Copy использует тот же API, а не голосование против. Спасибо, детка. Кроме того, как упоминает Майкл Г в своем ответе, прямой вызов API позволяет вам подключиться к событию прогресса/обратным вызовам. - person Yoopergeek; 19.10.2009
comment
Думаю, я просто устал видеть код, бессистемно использующий P/Invoke или повторную реализацию кода BCL из соображений производительности, потому что кодер не осознавал или не проверял, что предоставленные API уже работают быстро. Если вы предваряете свое сообщение примечанием о том, что единственный раз, когда вам нужно P/Invoke для копии файла, — это FileCopyEx для конкретной дополнительной информации, не предоставляемой управляемым API, я заберу -1. В противном случае считайте, что я всего лишь сварливый кодер. ;) - person Sam Harwell; 19.10.2009
comment
Z28, я слышу тебя. Я сильно изменил свой ответ, чтобы указать на то, что вы только что сказали. :) - person Yoopergeek; 19.10.2009
comment
Кстати, я забрал голос -1. Мой оставшийся комментарий объясняет мою сильную склонность к управляемому API везде, где это возможно. :) - person Sam Harwell; 19.10.2009

Другим преимуществом использования неуправляемого API Copy File является возможность отслеживать ход выполнения. перезвонить.

Вы можете увидеть пример того, как это сделать: здесь.

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

person Michael G    schedule 19.10.2009

Вы можете сделать это, позвонив по номеру System.IO.File.Copy. Его внутренняя реализация уже использует Windows API.

Редактировать: File.Copy также правильно обрабатывает разрешения и имеет то преимущество, что создает исключение со значимыми данными, если что-то не удается, поэтому вам не нужно вручную проверять и анализировать статус возврата.

person Sam Harwell    schedule 19.10.2009

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

person Pablo Yabo    schedule 06.11.2010