Мы с коллегой как раз собираемся переносить наши WPF приложения на Linux. Скорее всего серверная часть будет ASP NET, а в качестве клиента веб морда, возможно с реактом. Решили веб брать чтоб не париться с контролами карт и таблиц.
Можно сделать перекрестные ссылки. У семьи есть ссылка на дом и у дома есть ссылка на семью. Можно передавать как в конструкторе (семья построила дом), так и через специальный метод (семья переехала).
denisssCute, Должно и в отладке работать. Я для пробы скопировал один в один ваше добавление стилей в приложение и всё работает без вопросов. Как подключали библиотеку? Nuget или dll? Какую версию? Какой .NET Framework и Visual Studio?
ЗЫ Лагов быть не должно. У меня на этой библиотеке (причем на очень старой версии) 2 рабочих проекта, всё нормально отображается в том числе и на старых машинах.
Олег, ну перезапросить разрешение не проблема. Ардуинка к сожалению не вариант, только телефон на Android. Ладно, пофиг, сделаю через старое API, а там если что буду переделывать :-D
Олег, из-за специфики ПО никаких вопросов быть не должно. Вся работа с файлами (собственного расширения) происходит в фоне невидимо для пользователя. Он только потом можно посмотреть историю из сохраненных файлов. Ну и из-за того, что в дальнейшем эти файлы считываются уже готовым ПО на ПК через MTP, то крайне нежелательно куда-то переносить в другое место относительно уже существующих путей в корне внешней памяти.
И так как основной источник данных у меня будет написан в NDK, то не хотелось бы через JNI дергать сохранение в файл много раз в секунду.
Олег, но где гарантии что они в следующих версиях не выпилят? На маркет мне в данном случае пофиг, так что в целом могу делать что захочу. Старое API работает, так что скорее всего пока что придётся использовать его, а потом наверное буду думать есть ли смысл запариваться с новым.
Про новое разрешение я в курсе, в основном вопросе я упоминал что сделал его получение.
Олег, с разрешениями и старым API проблем нет. Что в 10, что в 11 папки, файлы создаются и можно писать в них. Вопрос именно про новое API, где все примеры это доступ к общим папкам или папке приложения.
Евгений Шатунов, может вы тогда с высоты своего "величия" соблаговолите ответить тогда на такой вопрос - если я буду использовать публичную папку для своего приложения (ту же Documents на внешней памяти) с новым API, то как мне получить в этом случае доступ к этой же папке из C и создавать/дозаписывать файлы? Это не потребует тогда разрешения MANAGE_EXTERNAL_STORAGE и я не смогу ничего ни у кого "своровать".
Евгений Шатунов, ну да, только мошенникам же такое надо. Я работаю в компании, занимающейся разработкой телекоммуникационного ПО для различных заказчиков (не частников). И эта задача как раз рабочая.
Изменил на C.
PS меня интересует ответ на вопрос, а не ваша реклама самого себя. И я не припомню чтобы мы переходили на ты.
Евгений Шатунов, помимо работы с файлами в Kotlin мне надо так же работать с ними в NDK на C++. Соответственно я должен в NDK так же как-то универсально получить путь к корню внешней памяти и чтобы это решение не использовало deprecated методов, если это возможно.
Владимир Коротенко, Где-то 40 мегабайт на 90к. В одной папке (мне скинули пример) есть миллион с лишним файлов. То есть это уже серьезный размер будет. Стоит учитывать что компьютеры клиента вовсе не топовые.
Владимир Коротенко, я ставил точку останова и делал профилирование памяти. Сразу после первой строчки весь список Entries уже заполнен сущностями для каждого файла в архиве. И все это сидит в памяти.
И тип свойства ReadOnlyCollection, а не IEnumerable.
Владимир Коротенко, вопрос не в объеме файлов, а в их количестве. У меня могут быть сотни тысяч файлы в архиве. Поэтому в списке Entries будет объект на каждый файл. В принципе сложно забить память, но лучше если решение будет по возможности потреблять как можно меньше памяти.
Склоняюсь к тому, что делать промежуточные архивы. Например по 10к файлов и записывать их в основной архивный файл.
Сделал проверку такого создания zip архива. В общем архив без использования лишней памяти создается, тут проблем нет.
А вот открытие архива всё равно считывает всю таблицу файлов zip архива в память :( При 90к файлов это в общем-то не страшно, а вот при миллионе уже может занять существенное пространство в памяти.
Есть ли какой-то способ извлечь конкретный файл из zip архива не читая всю таблицу в память?
Добавляет ли метод CreateEntryFromFile информацию о новом файле в какой-нибудь внутренний список файлов в архиве? Если так, то может съесть всю память.
Для чтения архива используется метод ZipFile.OpenRead(zipPath) и свойство Entries. Я правильно понимаю что это свойство считывает весь список файлов в память?
В принципе можно при архивировании создавать параллельно временный файл со списком всех изображений в конкретной папке. И в начале доставать файл (через метод GetEntry) со списком папок и потом файлы со списком файлов отдельных выбранных папок распаковать во временную папку и последовательно читать, не загружая память и не считывая список вообще всего, что есть в архиве.
Если этот подход не ест память, то он мне однозначно подходит.
Как лучше токен для обновления сделать? Я пологаю сгенерировать точно такой же токен, но на более долгое время и сунуть его в http only куку (чтоб никакой чужой код на клиенте при всём желании не смог получить доступ к нему)? При разлогинивании соответственно удаляем все токены (и короткоживущий, и токен для обновления).
zedxxx, базовые станции и WI-FI используются для начального приблизительного определения положения. Если отключить их использование, то первоначально телефон будет определять местоположение по спутникам намного дольше.
Насчёт уточнить вы правы, не совсем верный термин =)
Акселерометр/гироскоп/магнитометр совместно используются для фильтраци значений с GPS и отсеивании всяких бросков в сторону из-за потери сигнала/отражении сигнала от здания и т.д. через тот же фильтр Калмана.
zedxxx, уточнения координат выполнятся при помощи акселерометра/гироскопа/магнитометра при их наличии на телефоне. Но в Андроиде просто за использование базовых станций, WI-FI, Bluetooth и датчиков отвечает одна галочка в настроках.