Возможно, но целесообразно использовать SHFileOperation в службе Windows? Все эти функции API SHxxx в shell32.dll, похоже, были написаны с учетом программ уровня пользователя. Могу ли я быть уверенным, что SHFileOperation не будет отображать GUI когда-либо?Использование SHFileOperation в службе Windows
ответ
Я бы сказал, что это не подходит или целесообразно. Большинство API-интерфейсов shell32 были написаны с базовым пониманием того, что они будут использоваться в интерактивных процессах. Я не думаю, что вы можете гарантировать, что SHFileOperation никогда не отобразит компонент пользовательского интерфейса. В самом деле, если вы посмотрите на IFileOperation (это новый интерфейс Vista, который заменяет SHFileOperation), это ясно сказано:
разоблачает методы копировать, перемещать, переименовывать, создавать и удалять элементы оболочки, а также методы для обеспечить диалоги прогресса и ошибок. Этот интерфейс заменяет функцию SHFileOperation.
Согласно документации SHFILEOPTSTRUCT, вы можете использовать следующие флаги, чтобы предотвратить появление интерфейса:
FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR
или (если вы ориентируетесь Windows Vista), FOF_NO_UI
, который является таким же, как вышесказанное.
Глядя в файл ShellAPI.h
заголовка в Windows SDK, комментарий против FOF_NO_UI
говорит «не отображать любой интерфейс на всех», поэтому из этого я предполагаю, что это нормально использовать SHFileOperation
.
Я должен согласиться: нецелесообразно или целесообразно.
Причиной использования SHFileOperation является выполнение операций с пользовательским интерфейсом и/или которые могут быть обратимы. То есть использование SHFileOperation для удаления файлов собирается помещать файлы в корзину, а не удалять их, позволяя текущему интерактивному пользователю восстановить или отменить выполненную операцию. Поскольку службы работают на неинтерактивном рабочем столе, никто не сможет очистить этот мусорный бак.
У меня была эта проблема, и я работал над реализацией безопасной и надежной сетевой копии файлов между серверами и сетевыми ресурсами (большинство из этих акций основаны на фильтрах CIFS/NetApp), и SHFileOperation
время от времени терпит неудачу.
теперь начал использовать ROBOCOPY
(доступен по умолчанию во всех ОС Microsoft от Vista/Server 2008 вверх) и действительно выглядит интересным и надежным.
это открыло мне глаза: https://stackoverflow.com/a/1030752/559144
На данный момент, я согласен. Я думал использовать его, потому что он, похоже, копирует файлы вместе со своим дескриптором безопасности. Стандартный CopyFile этого не делает, поэтому для получения такого же поведения требуется дополнительный код. – Charles 2008-10-14 18:00:54