Чтение файла в переносимой библиотеки C# (Portable Class Library)

213
14 февраля 2018, 08:45

Подскажите пожалуйста, можно ли реализовать в переносимой библиотеки чтение файла? Возможно я что-то делаю не так, но в переносимой библиотеке не доступны такие класс как File, FileStream, невозможно создать экземпляр класса StreamReader или TextReader с помощью конструктора, которому передается в качестве параметра путь к файлу. При попытке написать вот такой код, ругается, что 'не удается преобразовать из "string" в "System.IO.Stream"'.

using System.IO;
namespace Project
{
   class Class1
   {
      public Class1(string path)
      {
         StreamReader reader = new StreamReader(path);
      }
   }
}
Answer 1

Скорее всего, среди списка платформ вы выбрали в том числе Silverlight или что-то подобное. Silverlight - это плагин к браузеру, и ему запрещен доступ к локальным файлам; потому там и нет нужных вам классов.

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

Answer 2

Создаем консольное приложение

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ClassLibrary1;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Class1 cl = new Class1("d://test.txt");
        }
    }
}

Добавляем в "солютион" средствами VisualStudio новый проект - отдельный класс Class1 в виде dll.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace ClassLibrary1
{
    public class Class1
    {
      public Class1(string path)
      {
         StreamReader reader = new StreamReader(path);
         string str = reader.ReadLine();
      }
    }
}

В менеджере проектов на у консольного проекта в разделе References добавляем ссылку на проект Class1

Компилируем solution, запускаем в отладчике - все работает

Answer 3

Вам необходимо будет в PLC проект добавить интерфейс.

Пример интерфейса:

public interface IFileWorker
{
    Task<bool> ExistsAsync(string filename); // проверка существования файла
    Task SaveTextAsync(string filename, string text);   // сохранение текста в файл
    Task<string> LoadTextAsync(string filename);  // загрузка текста из файла
    Task<IEnumerable<string>> GetFilesAsync();  // получение файлов из определнного каталога
    Task DeleteAsync(string filename);  // удаление файла
}

Далее для каждого из проектов (Android, iOS и т.д.) реализовать данный интерфейс.

Пример реализации для Andriod:

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Xamarin.Forms;
using System.Linq;
[assembly: Dependency(typeof(FileApp.Droid.FileWorker))]
namespace FileApp.Droid
{
    public class FileWorker : IFileWorker
    {
        public Task DeleteAsync(string filename)
        {
            // удаляем файл
            File.Delete(GetFilePath(filename));
            return Task.FromResult(true);
        }
        public Task<bool> ExistsAsync(string filename)
        {
            // получаем путь к файлу
            string filepath = GetFilePath(filename);
            // существует ли файл
            bool exists = File.Exists(filepath);
            return Task<bool>.FromResult(exists);
        }
        public Task<IEnumerable<string>> GetFilesAsync()
        {
            // получаем все все файлы из папки
            IEnumerable<string> filenames = from filepath in Directory.EnumerateFiles(GetDocsPath())
                                            select Path.GetFileName(filepath);
            return Task<IEnumerable<string>>.FromResult(filenames);
        }
        public async Task<string> LoadTextAsync(string filename)
        {
            string filepath = GetFilePath(filename);
            using (StreamReader reader = File.OpenText(filepath))
            {
                return await reader.ReadToEndAsync();
            }
        }
        public async Task SaveTextAsync(string filename, string text)
        {
            string filepath = GetFilePath(filename);
            using (StreamWriter writer = File.CreateText(filepath))
            {
                await writer.WriteAsync(text);
            }
        }
        // вспомогательный метод для построения пути к файлу
        string GetFilePath(string filename)
        {
            return Path.Combine(GetDocsPath(), filename);
        }
        // получаем путь к папке MyDocuments
        string GetDocsPath()
        {
            return Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        }
    }
}

Для iOS проекта:

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Xamarin.Forms;
using System.Linq;
[assembly: Dependency(typeof(FileApp.iOS.FileWorker))]
namespace FileApp.iOS
{
    public class FileWorker : IFileWorker
    {
        public Task DeleteAsync(string filename)
        {
            File.Delete(GetFilePath(filename));
            return Task.FromResult(true);
        }
        public Task<bool> ExistsAsync(string filename)
        {
            string filepath = GetFilePath(filename);
            bool exists = File.Exists(filepath);
            return Task<bool>.FromResult(exists);
        }
        public Task<IEnumerable<string>> GetFilesAsync()
        {
            IEnumerable<string> filenames = from filepath in Directory.EnumerateFiles(GetDocsPath())
                                            select Path.GetFileName(filepath);
            return Task<IEnumerable<string>>.FromResult(filenames);
        }
        public async Task<string> LoadTextAsync(string filename)
        {
            string filepath = GetFilePath(filename);
            using (StreamReader reader = File.OpenText(filepath))
            {
                return await reader.ReadToEndAsync();
            }
        }
        public async Task SaveTextAsync(string filename, string text)
        {
            string filepath = GetFilePath(filename);
            using (StreamWriter writer = File.CreateText(filepath))
            {
                await writer.WriteAsync(text);
            }
        }
        string GetFilePath(string filename)
        {
            return Path.Combine(GetDocsPath(), filename);
        }
        string GetDocsPath()
        {
            return Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        }
    }
}

Для вызова методов, определенных в интерфейсе, используется DependencyService

Например, чтобы прочитать из файла, в PLC проект достаточно добавить следующую строчку кода:

    string Text = await DependencyService.Get<IFileWorker>().LoadTextAsync("Example.txt");

Материал взят от сюда

READ ALSO
Не работает условие

Не работает условие

Не срабатывает true, хотя долженМожет кто увидит ошибку в синтаксисе

179
Как кинуть текущий год в содержимое тега?

Как кинуть текущий год в содержимое тега?

Как кинуть текущий год в содержимое тега? текущий год могу найти а как кинуть не получается

238
Работа с файловой системой на USB носителе

Работа с файловой системой на USB носителе

Разрабатываем операционную систему JsOSНужно написать драйвер для работы с ФС на USB носителе

210
Только одно из трёх условий проходит валидацю

Только одно из трёх условий проходит валидацю

Суть в том, чтобы при заполнении поля выводилось сообщение: всё ок, заполните поле, занято

282