2009-10-19 4 views
2

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

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

+1

Любая причина, по которой System.IO.File.Copy (System.String sourceFileName, System.String destFileName, System.Boolean overwrite) недостаточно? – Yoopergeek

+0

Полагаю, вы хотите сделать это из-за скорости? , нет другой причины не использовать управляемую копию файла, я вполне уверен, что если бы вы сделали некоторые тесты, вы бы нашли их очень близко. ,Net делает чертовски хорошую работу по оптимизации кода при достижении уровня IL – RC1140

ответ

5

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

Вы не должны делать это в управляемом коде, из-за тех же причин, вы не должны write managed shell extensions.

+0

Это хороший момент, который я не рассматривал. Я не могу дождаться, пока WIN32 не получит собственную виртуальную машину WOW, а CLR - это базовый API defacto. До тех пор я просто должен сделать это на C++. Благодарю. –

+0

Любые мысли о .NET на эту тему? – Caramiriel

11

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

Оригинальный ответ:(который вы действительно не должны использовать ...)

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

+0

i wouldnt say -1, но его технически то же самое, что и вызов управляемого кода с преимуществами управляемого кода, и пользователь задал неуправляемый код – RC1140

+2

Вопрос было: Как подключить копию файла API Windows. Невозможно использовать System.IO.File.Copy. Комментарии к вопросу должны указывать на System.IO.File.Copy использует тот же API, а не проголосовать. Спасибо. Также, как Майкл G упоминает в своем ответе - прямое обращение к API позволяет подключаться к событиям-событиям/обратным вызовам. – Yoopergeek

+0

Думаю, мне просто надоело видеть код, случайно использующий P/Invoke или повторное выполнение кода BCL «по соображениям производительности», потому что кодер не понимал или не проверял, что предоставленные API были уже быстрыми. Если вы предируете свой пост запиской о том, что единственный раз, когда вам нужно будет P/Invoke для копирования файла, это 'FileCopyEx' для конкретной дополнительной информации, не предоставленной управляемым API, я возьму обратно -1. В противном случае возьмите его, поскольку я всего лишь сердитый кодер. ;) –

1

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

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

2

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

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

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

1

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

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

  • Нет связанных вопросов^_^