Некоторые из "известных папок" оболочки (Shell known folders) могут быть помечены как
KF_CATEGORY_FIXED
, что делает их неперемещаемыми. И наоборот, если папка файловой системы не является "неподвижной", то она может быть перемещена.Эта дихотомия представляется простой и недостойной отдельного обсуждения - за исключением того, что у некоторых клиентов иногда возникают проблемы включения этого понятия в своё мировоззрение.
У меня есть код, который вызываетРазница в том, чтоSHSetFolderPath
, и он работает для большинства папок, но для некоторых значений CSIDL вродеCSIDL_COMMON_APPDATA
код завершается с ошибкойE_INVALIDARG
. При этом не имеет значения, вызываю ли я его с повышением привилегий или нет. Что я делаю не так?
CSIDL_COMMON_APPDATA
(известная в Новом Мировом Порядке как FOLDERID_ProgramData
) помечена как KF_CATEGORY_FIXED
, так что её нельзя переместить.
А есть ли способ игнорировать флаг KF_CATEGORY_FIXED
и переместить её?
Нет. Она неперемещаема. Извините. Вам просто остаётся принять тот факт, что эта папка не поменяет своё расположение по вашему желанию.И буквально на следующий день мы получили такой вопрос от совершенно другого клиента:
У нас есть программа, которая следит за "известной папкой", но наш код вылетает, если пользователь меняет расположение папки в то время, пока программа за ней следит. Есть ли какой-нибудь способ сделать так, чтобы пользователь не мог двигать папку?Если папка может быть перемещена, то вам нужно принять тот факт, что она может быть перемещена. Вы не можете изменить порядок вещей только потому, что это сделает легче жизнь лично вам.
Я нахожу любопытным, что мы получили два запроса подряд, которые просят о полностью противоположных вещах: "Я хочу сделать эту папку перемещаемой!" и "Я хочу сделать эту папку неперемещаемой!". Я могу только догадываться о том хаосе, который вызовут эти программы, будучи запущенными одновременно на одной машине!
Что может сделать программа - зарегистрировать
IFileIsInUse
для каталога, так что оболочка вызовет её, когда кто-то захочет переместить папку. И тогда, по крайней мере, программа будет знать, когда будут происходить страшные вещи, и подготовиться к ним. Мне сказали, что простой пример использования IFileIsInUse
можно найти в SDK Windows 7 SDK в каталоге winui\Shell\AppPlatform\FileIsInUse. И ещё есть старая статья по этой теме в сейчас-уже-не-работающем блоге Shell Revealed.
Ура! Наконец-то свежие переводы!! :)
ОтветитьУдалить