Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Доступ к файловой системе из Portable Class Library (PCL)

Anna | 17.06.2014 | нет комментариев
В один красивый день у меня возникла идея о портировании своего .NET кода на другие платформы с вынесением стержневой логики (все что не касается UI) в отдельную библиотеку Portable Class Library (PCL).

В теории звучит все изумительно – с PCL дозволено трудиться фактически на всех устройствах, и не только с .NET Framework, но и даже с Mono! С таком подходом открываются крупные мультиплатформенные перспективы, к примеру, перенос кода Windows Phone на Android и iOS с поддержкой Xamarin.

Но ознакомившись с PCL поближе, я пришел к итогу, что такая библиотека это по сути урезанный .NET, рассматривающий ограничения всякой платформы. То есть даже на с виду схожих WP8 и W8 не удастся все спихнуть в PCL.

Таблица вероятностей PCL на различных платформах

На 1-й взор мой код должен был перейти без задач (целевые платформы: Windows .NET, Windows 8, Windows Phone), но компилятор обругал System.IO, а именно StreamReader, тот, что напрямую открывал файл.

Припомнив что у Windows 8 и Windows Phone абсолютно другие методы для работы с файлами и различные между собой:

WP использует IsolatedStorage для доступа к файлам приложения, а Windows 8, хоть и имеет доступ к публичным папкам, но делает это через Windows.Storage (WP8 тоже сейчас может через него, но для сохранения поддержки WP7 такой метод не рекомендуется применять). Попользовавшись гуглом, мне стало ясно, что организовать доступ к файлам на чистом PCL немыслимо, а советы как бы передачи Steam теснее из приложения либо жесткого включения файла в DLL для моего решения не подходили. Дело в том, что программа работала с огромным внешним словарем и сберегала временные итоги работы в файлах. Но здесь на глаза попалась библиотека PCLStorage, обещавшая какую-никакую работу с ФС через PCL.

PCLStorage предоставляет три интерфейса – IFIle, IDirectory, IFileSystem, все они обеспечивают асинхронные операции чтения и записи файлов и директорий.

Примечание: Все последующие тесты проводились на «классическом» Windows. 

Пример записи файла:

 public async Task PCLCreateFile(string name, string content)
        {
            IFolder localStorage = FileSystem.Current.LocalStorage;

            IFolder contentFolder = await localStorage.CreateFolderAsync("Content", CreationCollisionOption.OpenIfExists);

            IFile file = await contentFolder.CreateFileAsync(name, CreationCollisionOption.ReplaceExisting);

            await file.WriteAllTextAsync(content);
        }

Пример чтения файла:

      public async Task<string> PCLReadFile(string name)
        {
            IFolder localStorage = FileSystem.Current.LocalStorage;

            IFolder contentFolder = await localStorage.GetFolderAsync("Content");

            IFile file = await contentFolder.GetFileAsync(name);

            return await file.ReadAllTextAsync();
        }

Выглядит и работает все отменно. Но… как получить доступ к файлу, тот, что находится в директории программы?

IFileSystem возвращает два пути LocalStorage и RoamingStorage. 1-й указывает на директорию которая выделена для программы в нынешней системе, 2-й на публичную директорию для синхронизации данных. В частности в Windows LocalStorage указывал на (AppData\Local), что вдалеке не являлось директорией приложения и не содержало никаких файлов.

На директорию приложения PCLStorage, к сожалению, указать не могло.

Безусловно, допустимо было сделать особый инсталлятор, но как быть в случае Store приложений? Тем не менее, решение возникло – копирование файлов в LocalStorage из самого приложения (либо загрузка из сети в самом PCL (не проверялось)). Что же, метод в результате вышел больше примитивный, чем передача Stream, плюс возникла вероятность трудиться со временными файлами в ограниченной среде портативной библиотеки.

P.S.: Под конец эксперимента оказалось что поддержку WP7 из последней версии выбросили, из-за чего собственно говоря все и затевалось (Из-за раздельного применения IsolatedStorage на WP и Windows.Storage на Windows 8).

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB