2008-10-14 6 views
1

Возможно, но целесообразно использовать SHFileOperation в службе Windows? Все эти функции API SHxxx в shell32.dll, похоже, были написаны с учетом программ уровня пользователя. Могу ли я быть уверенным, что SHFileOperation не будет отображать GUI когда-либо?Использование SHFileOperation в службе Windows

ответ

2

Я бы сказал, что это не подходит или целесообразно. Большинство API-интерфейсов shell32 были написаны с базовым пониманием того, что они будут использоваться в интерактивных процессах. Я не думаю, что вы можете гарантировать, что SHFileOperation никогда не отобразит компонент пользовательского интерфейса. В самом деле, если вы посмотрите на IFileOperation (это новый интерфейс Vista, который заменяет SHFileOperation), это ясно сказано:

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

+0

На данный момент, я согласен. Я думал использовать его, потому что он, похоже, копирует файлы вместе со своим дескриптором безопасности. Стандартный CopyFile этого не делает, поэтому для получения такого же поведения требуется дополнительный код. – Charles 2008-10-14 18:00:54

6

Согласно документации SHFILEOPTSTRUCT, вы можете использовать следующие флаги, чтобы предотвратить появление интерфейса:

FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR 

или (если вы ориентируетесь Windows Vista), FOF_NO_UI, который является таким же, как вышесказанное.

Глядя в файл ShellAPI.h заголовка в Windows SDK, комментарий против FOF_NO_UI говорит «не отображать любой интерфейс на всех», поэтому из этого я предполагаю, что это нормально использовать SHFileOperation.

1

Я должен согласиться: нецелесообразно или целесообразно.

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

0

У меня была эта проблема, и я работал над реализацией безопасной и надежной сетевой копии файлов между серверами и сетевыми ресурсами (большинство из этих акций основаны на фильтрах CIFS/NetApp), и SHFileOperation время от времени терпит неудачу.

теперь начал использовать ROBOCOPY (доступен по умолчанию во всех ОС Microsoft от Vista/Server 2008 вверх) и действительно выглядит интересным и надежным.

это открыло мне глаза: https://stackoverflow.com/a/1030752/559144