• 0
Авторизация  
Вадим Смоленский

Создание каталога из UWP-приложения

Вопросы

При упаковке Windows-приложения в appx все дополнительные файлы приходится класть в одну папку с исполнимым файлом, ибо Deployment Manager, судя по всему, не предусматривает возможности сразу положить их в AppData. Но я все-таки хочу, чтобы некоторые файлы были легко доступны пользователям, поэтому организовал приложение так, что оно при первом запуске создает новый каталог в AppData:

MyDirectory:=GetSpecialFolderPath(CSIDL_APPDATA)+'\MyApp';
CreateDir(MyDirectory);
TDirectory.SetAttributes(MyDirectory,[TFileAttribute.faNormal]);

После этого в созданный каталог переносятся некоторые файлы, и всё работает хорошо, за исключением одного момента: этот новый каталог невозможно открыть, например, в Проводнике. Из самого приложения легко можно открыть диалоговое окно и увидеть в нем этот каталог и все файлы; можно их читать и в них писать, но вне приложения этот каталог невидим. Всё равно что не существует.

Мне казалось, что присвоение каталогу атрибута faNormal дожно все проблемы решить. Увы, не решает. В чем тут закавыка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 ответов на этот вопрос

  • 0

AppData скрытая папка же...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
9 минут назад, wamaco сказал:

AppData скрытая папка же...

В том и дело, что AppData в Проводнике прекрасно открывается, и все папки, что в ней лежат, прекрасно видно - за вычетом вот этой, только что созданной AppData\MyApp.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
4 часа назад, Вадим Смоленский сказал:

В том и дело, что AppData в Проводнике прекрасно открывается, и все папки, что в ней лежат, прекрасно видно - за вычетом вот этой, только что созданной AppData\MyApp.

Кстати, я бы расценил это как МЕГА фичу! :)) 

Попробуйте выполнить

attrib -S -H /S /C:\...\AppData\MyApp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, wamaco сказал:

Попробуйте выполнить

attrib -S -H /S /C:\...\AppData\MyApp

Будете смеяться, но эта папка не видна даже из Command Prompt. При попытке, например, вызвать cd ...MyApp выдается "The system cannot find the path specified".

А из приложения, повторюсь, всё прекрасно открывается. Да сами можете попробовать, на каком-нибудь пустом приложении. Дело нехитрое.

Возможно, это и мегафича для тех, кто хочет понадежнее всё спрятать от дураков-юзеров, а равно от хакеров. Но у меня задача прямо противоположная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

В ходе дальнейших экспериментов поменял CSIDL_APPDATA на CSIDL_COMMON_APPDATA, и проблема ушла. Все файлы ложатся в папку  C:\ProgramData\MyApp и прекрасно видны из любого места.

Так что да, всё дело было в особом статусе папки AppData. Хотя и выглядело странно, конечно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Похожий контент

    • От Вадим Смоленский
      Целый месяц бодаюсь с Microsoft Store, пытаясь разместить у них свое UWP-приложение в виде пакета appx. Получаю отлуп за отлупом. Проблема: приложение должно располагать папкой для пользователя, отличной от установочного каталога, где он мог бы сохранять файлы. Там же должны храниться файлы настроек. Раньше, создавая дистрибутив в InnoSetup, я всегда предусматривал создание такой папки по адресу <user>\AppData\Roaming\MyApp. Теперь всё полагается указывать в разделе Deployment - но как там указать такой адрес? Вроде бы, есть графа "Remote path", и логично существовать каким-то макросам для нее, вроде AppData - но никакой информации на эту тему я найти не смог. Видел лишь упоминания таких макросов, как res, assets, classes, library - однако все они, как я понял, относятся к мобильным платформам.
      Попытки обходных маневров не удались. Сначала я решил всё класть в установочный каталог, а при первом запуске создавать нужную папку и перебрасывать в нее несколько файлов. На моем компьютере это работает, но при тестировании в Microsoft Store отчего-то валится (присылают скриншот с сообщением "Access is denied"). То ли нельзя стирать файлы в установочном каталоге, то ли нельзя в таком режиме создавать новый каталог. Потом я прочитал где-то, что UWP-приложениям всё равно, где лежат файлы, они могут их менять даже в установочном каталоге. Попробовал всё валить в одну кучу и так работать. Увы, опять отрапортовали о падении ("The app tries to create a file under WindowsApps folder").
      Получается, что все-таки нужно как-то заставить appx-дистрибутив создавать при установке папку по адресу <user>\AppData\Roaming\MyApp. Но как?
      Спрашивал на experts-exchange, там знатоков не нашлось. Если и здесь нет, может, кто-нибудь хотя бы подскажет, в каких местах есть смысл спросить?
    • От Вадим Смоленский
      Проект для Windows, автономная БД SQLite, никаких клиент-серверных дел, компоненты и операции самые простые: SQL-запрос в TFDQuery, вызов метода Open. Всё работает нормально, но отдельные пользователи жалуются на эпизодические непредсказуемые падения при поиске. Интересно, что после каждого такого падения всё опять функционирует нормально, но потом приложение не удается нормально закрыть, приходится вызывать диспетчер задач.
      Стабильно воспроизвести не могут ни пользователи, ни я сам. Мне удалось это считанные несколько раз - я лишь смог убедиться через отладчик, что проблема при закрытии связана именно с базой данных: вставлял в обработчик FormCloseQuery оператор TFDConnection.Close - и программа пару раз упала именно на этом операторе.
      Найти корень зла пока не удалось. Показалось только, что проблема возникает лишь тогда, когда поиск приводит к слишком большому (несколько тысяч) числу записей в TFDQuery.
      Может, стоит поменять какие-нибудь установки в TFDConnection или TFDQuery ?
    • От Вадим Смоленский
      Упаковываю свое приложение в appx при помощи кнопки Deploy в Deployment Manager. При этом в разделе Опций "Manifest File" выставлено "Auto Generate". В итоге получается файл AppxManifest.xml; насколько я понимаю, этот манифест также включается в состав итогового пакета appx.
      Пробую загрузить получившийся appx в Microsoft Store. Грузится очень долго и в итоге выдает ошибку: "You don't have permissions to specify the following namespaces in the appx manifest file of the package MyApp.appx: restricted namespace: http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
      В файле AppxManifest.xml действительно отыскивается такой фрагмент. Убираю его, заодно убираю фрагмент  <Capabilities> ... </Capabilities> (если не убрать, получившийся xml даже не отобразится в браузере), переименовываю в MyApp.manifest, меняю установку для манифеста на "Custom", указываю имя. Всё повторяю. Результат ровно тот же.
      Полностью меняю содержимое MyApp.manifest, беря шаблон отсюда. Всё повторяю. Результат опять тот же. Опять магазину не нравится фрагмент манифеста насчет restricted capabilities, которого теперь, по идее, там быть не должно.
      Такое ощущение, что при формировании пакета appx не имеют никакого значения установки по поводу манифеста. Он всегда запихивается в appx в некоем дефолтном варианте, повлиять на который невозможно.
      Или все-таки возможно?
    • От Вадим Смоленский
      Устанавливая и запуская свое Windows-приложение, предназначенное для Microsoft Store и запакованное в appx, наткнулся на интересный феномен. Чтобы узнать адрес текущего каталога, я всегда использовал функцию SysUtils.GetCurrentDir. Полученный полный адрес был мне нужен, например, чтобы показывать в TWebBrowser файлы хелпов (относительные адреса там почему-то не прокатывают). Раньше адресом текущего каталога всегда был адрес, где лежит исполнимый файл - условно говоря, C:\Program Files\MyApp. Теперь, когда пакет создается по принципам UWP,  исполнимый файл и прочее хозяйство кладется в каталог C:\Program Files\WindowsApps\MyApp_1.0.0.0_x86__sp51hrchc9zqj.  При этом функция GetCurrentDir почему-то возвращает совершенно другой адрес, а именно C:\WINDOWS\system32. Соответственно, TWebBrowser ничего не показывает.
      Функция SysUtils.GetDir ведет себя так же.
      Как быть?
    • От Вадим Смоленский
      В RAD Studio, начиная с Berlin, предусмотрена возможность создавать пакеты appx для загрузки приложений в Microsoft Store. К сожалению, материалов на эту тему пока немного, толковая ссылка нашлась лишь одна:
      https://community.embarcadero.com/blogs/entry/appx-development-for-windows-10-store
      Там толково объяснено, как создать appx для приложения из одного исполнимого файла. Я попробовал, всё получилось. Но как быть, если пакет должен содержать и другие файлы? В моем случае это файл базы данных, целая папка html-файлов для хелпов, и т.п. Где я должен их указать? Логично было бы предположить, что за это ответственен манифест (Project => Options => Application => Manifest File), который можно кастомизировать. Но сколько я ни гуглил, не смог найти ничего о структуре этого манифеста применительно к файлам. Похоже, манифест здесь все-таки ни при чем.
      Раньше я всё это делал в Inno Setup. Как поступать теперь - непонятно...
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу